2012-08-29 40 views
8

Vì vậy, tôi có một số nguyên có giá trị 7. (0b00000111) Và tôi muốn thay thế nó bằng hàm thành 13. (0b00001101) Vậy thuật toán tốt nhất để thay thế byte trong một số nguyên? Ví dụ:Sửa đổi các bit trong một số nguyên trong Python

set_bits(somevalue, 3, 1) # What makes the 3rd bit to 1 in somevalue? 
+1

Cũng giống như trong C. http://wiki.python.org/moin/BitwiseOperators – Kos

+2

Hãy cẩn thận với các tiền tố của bạn cho các số nguyên nguyên ... '0x' là tiền tố cho số _hexadecimal_. Tiền tố bạn muốn là '0b'. –

Trả lời

3

Bạn có thể sử dụng tác vụ bitwise. http://wiki.python.org/moin/BitwiseOperators

nếu bạn muốn thiết lập một chút cho 1 bạn có thể sử dụng Bitwise 'hoặc' với 1 vị trí nhất định trên:

0b00000111 | 0b00001000 = 0b00001111

để thiết lập một chút trao cho 0 bạn có thể sử dụng Bitwise 'và'

0b00001111 & 0b11111011 = 0b00001101

Lưu ý rằng 0b tiền tố là cho số nhị phân và 0x là dành cho hệ thập lục phân .

+0

Xin chào, thay vì đăng câu trả lời mới và xóa câu trả lời cũ, hãy cân nhắc chỉ chỉnh sửa câu trả lời cũ của bạn. :-) – sloth

+0

Đó là ý định của tôi nhưng tôi đã mở nó trong hai tab và gửi từ một sai lầm :) – wmiel

+0

Nhưng tôi muốn đặt byte theo chỉ mục. –

18

Bạn chỉ cần:

def set_bit(v, index, x): 
    """Set the index:th bit of v to 1 if x is truthy, else to 0, and return the new value.""" 
    mask = 1 << index # Compute mask, an integer with just bit 'index' set. 
    v &= ~mask   # Clear the bit indicated by the mask (if x is False) 
    if x: 
    v |= mask   # If x was True, set the bit indicated by the mask. 
    return v   # Return the result, we're done. 

>>> set_bit(7, 3, 1) 
15 
>>> set_bit(set_bit(7, 1, 0), 3, 1) 
13 

Lưu ý rằng cắn số (index) là từ 0, với 0 là bit ít quan trọng.

Cũng lưu ý rằng giá trị mới là trả về, không có cách nào để sửa đổi số nguyên "tại chỗ" như bạn hiển thị (ít nhất tôi không nghĩ vậy).

+0

Ông nói, tình cờ, như thể hàng ngàn người thiếu kinh nghiệm với nhị phân sẽ không phải đi qua bước mã này từng bước trong những năm qua để tìm ra cái quái gì mà nó làm cho nó hoạt động một cách hoàn hảo. – Aerovistae

+0

@Aerovistae Heh ... Không chắc chắn bạn đang bị lưỡi-trong-má. Tôi đã thêm nhận xét để làm cho mã thậm chí còn rõ ràng hơn. Hy vọng rằng sẽ tiết kiệm tất cả những người một số công việc. :) – unwind

+0

Cảm ơn! Tôi đã thực sự là lưỡi-in-má. Đã phải hoàn toàn học lại các hoạt động nhị phân của tôi để hiểu những gì đang diễn ra; đã không chạm vào 'em từ đại học. – Aerovistae

16

Những công việc cho số nguyên kích thước bất kỳ, thậm chí lớn hơn 32 bit:

def set_bit(value, bit): 
    return value | (1<<bit) 

def clear_bit(value, bit): 
    return value & ~(1<<bit) 

Nếu bạn thích điều ngắn, bạn chỉ có thể sử dụng:

>>> val = 0b111 
>>> val |= (1<<3) 
>>> '{:b}'.format(val) 
'1111' 
>>> val &=~ (1<<1) 
'1101' 
+0

Tuyệt vời để thiết lập và xóa cờ trong một số nguyên! Không có thư viện nào yêu cầu :) –

Các vấn đề liên quan