Hướng dẫn python bit length - chiều dài bit python

Kiểu int trong Python có cài đặt sẵn một abstract base class – lớp trừu tượng cơ sở là numbers.Integral.

  • 1. Hàm int.bit_length[]
  • 2. Hàm int.to_bytes[length, byteorder, *, signed=False]
  • 3. Hàm int.from_bytes[bytes, byteorder, *, signed=False]

Trả về số lượng các bits cần thiết để biểu diễn một số nguyên ở dạng nhị phân, không bao gồm phần dấu và các số 0 ở đầu.

Đoạn code ví dụ:

# -----------------------------------------------------------
#Cafedev.vn - Kênh thông tin IT hàng đầu Việt Nam
#@author cafedevn
#Contact: 
#Fanpage: //www.facebook.com/cafedevn
#Instagram: //instagram.com/cafedevn
#Twitter: //twitter.com/CafedeVn
#Linkedin: //www.linkedin.com/in/cafe-dev-407054199/
# -----------------------------------------------------------


num = 7
print[num.bit_length[]] 
  
num = -7
print[num.bit_length[]] 

Kết quả in ra là:

3
3

2. Hàm int.to_bytes[length, byteorder, *, signed=False]

3. Hàm int.from_bytes[bytes, byteorder, *, signed=False]

Trả về số lượng các bits cần thiết để biểu diễn một số nguyên ở dạng nhị phân, không bao gồm phần dấu và các số 0 ở đầu.


# Returns byte representation of 1024 in a 
# big endian machine. 
print[[1024].to_bytes[2, byteorder ='big']] 

Kết quả in ra là:

b'\x04\x00'

3. Hàm int.from_bytes[bytes, byteorder, *, signed=False]

Trả về số lượng các bits cần thiết để biểu diễn một số nguyên ở dạng nhị phân, không bao gồm phần dấu và các số 0 ở đầu.

Đoạn code ví dụ:


# Returns integer value of '\x00\x10' in big endian machine. 
print[int.from_bytes[b'\x00\x10', byteorder ='big']] 

Kết quả in ra là:

16

Trả về một mảng các bytes đại diện cho một số nguyên

  • w3school
  • python.org
  • Ví dụ trả về biểu diễn kiểu byte ở định dạng 1024 theo kiểu big endian:

Trả về biểu diễn dạng số nguyên của một mảng các bytes được cho trước

  • Ví dụ trả về giá trị nguyên của ‘\x00\x10’ theo kiểu big endian
  • Nguồn và Tài liệu tiếng anh tham khảo:
  • geeksforgeeks

Tài liệu từ cafedev:

  • Full series tự học Python từ cơ bản tới nâng cao tại đây nha.
  • Ebook về python tại đây.
  • Các series tự học lập trình khác
  • Nếu bạn thấy hay và hữu ích, bạn có thể tham gia các kênh sau của cafedev để nhận được nhiều hơn nữa:
  • Group Facebook
  • Fanpage
  • Youtube
  • Instagram

Twitter

Linkedin

Với biểu diễn chuỗi thập phân của một số nguyên dương lớn, cách nhanh để tìm độ dài bit của số nguyên là gì? Sử dụng int[] và sau đó

3
3
0 chậm. Ví dụ này với một triệu chữ số mất hơn năm giây để cho tôi biết nó có 3321926 bit:

s = '1234567890' * 10**5
print[int[s].bit_length[]]

Kết quả phải chính xác, ít nhất là cho tất cả các chuỗi mà người ta thực sự có thể có trong bộ nhớ [vì vậy hãy nói lên tới 100 tỷ chữ số thập phân].

Đã hỏi ngày 18 tháng 5 lúc 19:11May 18 at 19:11

Kelly Bundykelly BundyKelly Bundy

18.3K7 Huy hiệu vàng24 Huy hiệu bạc55 Huy hiệu Đồng7 gold badges24 silver badges55 bronze badges

13

Với biểu diễn chuỗi thập phân của một số nguyên dương lớn, cách nhanh để tìm độ dài bit của số nguyên là gì? Sử dụng int[] và sau đó

3
3
0 chậm. Ví dụ này với một triệu chữ số mất hơn năm giây để cho tôi biết nó có 3321926 bit:

Kết quả phải chính xác, ít nhất là cho tất cả các chuỗi mà người ta thực sự có thể có trong bộ nhớ [vì vậy hãy nói lên tới 100 tỷ chữ số thập phân].May 18 at 19:27

Đã hỏi ngày 18 tháng 5 lúc 19:11Karl Knechtel

Nếu không gian lưu trữ không phải là vấn đề và bạn không ngại dành thời gian trở lại phía trước, [và bạn muốn có một giải pháp không phụ thuộc vào độ chính xác của điểm nổi, ngay cả khi nó không thực tế] bạn có thể giải quyết bất kỳ Vấn đề tốc độ với nhiều bộ nhớ hơn. Xây dựng một bảng tra cứu các biểu diễn chuỗi của

3
3
1. Thiết lập một từ điển, khóa chiều dài chuỗi thành một danh sách [chuỗi có độ dài, giá trị n tương ứng]. Để kiểm tra đầu vào, hãy tìm danh sách thích hợp và sau đó sử dụng so sánh chuỗi thông thường để tìm ra danh mục độ dài bit nào.10 gold badges86 silver badges132 bronze badges

3

Đã trả lời ngày 18 tháng 5 lúc 19:27

import math

s = '1234567890' * 10**5

dper = math.log[10]/math.log[2]
base= [len[s]-10]*dper
extra = math.log[int[s[:10]]]/math.log[2]
print[int[base+extra+0.99]]

Đã trả lời ngày 18 tháng 5 lúc 19:26May 18 at 19:26

Tim Robertstim RobertsTim Roberts

41.2k3 Huy hiệu vàng18 Huy hiệu bạc28 Huy hiệu đồng3 gold badges18 silver badges28 bronze badges

3

Điều này thực hiện ví dụ trong khoảng 0,15 giây và

3
3
2 trong khoảng 2 giây và
3
3
3 trong khoảng 20 giây. Đầu tiên tôi xấp xỉ độ dài bit bằng logarit [tương tự như thời gian của Tim], sau đó tôi sử dụng
3
3
4 để điều chỉnh cho đến chính xác. Lớp đó sử dụng Base 10, vì vậy nó không cần chuyển đổi cơ sở tốn kém.

Độ dài bit B bao gồm khoảng [2 ** [B-1], 2 ** B]. Vì vậy, chúng tôi muốn [số mũ của] công suất nhỏ nhất 2 lớn hơn số.

Hãy thử nó trực tuyến!

from time import time
from math import log2
from decimal import *

setcontext[Context[prec=MAX_PREC, Emax=MAX_EMAX, Emin=MIN_EMIN]]

def bit_length[s]:
    if len[s]  n:
        b -= 1
        power //= 2
    while power 

Bài Viết Liên Quan

Chủ Đề