Hướng dẫn how does python determine bitwise complement? - python xác định bổ sung bitwise như thế nào?

Nhà điều hành lời khen của Bitwise sẽ đảo ngược các bit nhị phân.

Nếu một chút là 1, nó sẽ thay đổi nó thành 0.

Nếu bit là 0, nó sẽ thay đổi nó thành 1.

Thí dụ

Hãy để một số 4.4.

Sau đó ~ 4 sẽ là,

4 = (00000100) 2

~ 4 = (11111011) 2. Nó sẽ chuyển đổi tất cả 1 thành 0 và 0 thành 1.

Giải thích bằng hình ảnh

Hướng dẫn how does python determine bitwise complement? - python xác định bổ sung bitwise như thế nào?




Nếu chúng ta in giá trị ~ 4 bằng printf, nó sẽ in -5. Làm sao?

Chúng ta hãy xem làm thế nào -5 sẽ được lưu trữ trong máy tính?

Như chúng tôi đã thảo luận về các số âm trước đó được biểu thị bằng mẫu bổ sung 2 2.

Để biết cách tính toán 2 bổ sung của một số, vui lòng giới thiệu liên kết. Các số nguyên được lưu trữ trong bộ nhớ

Vì vậy, -5 sẽ được lưu trữ như dưới đây,-5 will be stored like below,

5 = (00000101) 2

1 Bổ sung 5 = (11111010) 2

Thêm 1 để có được phần bổ sung 2,

-5 = (11111011) 2

Kết quả của ~ 4 bằng với biểu diễn của -5 trong nhị phân, do đó ~ 4 là -5.~4 is -5.


Ví dụ 2

Hãy để số 2,

2 = (00000010) 2

1 Bổ sung 2 = (11111101) 2

Thêm 1 để có được phần bổ sung 2,

-5 = (11111011) 2

Kết quả của ~ 4 bằng với biểu diễn của -5 trong nhị phân, do đó ~ 4 là -5.~2 is -3.




Ví dụ 2

Thí dụ

#Bitwise ones complement operator in python

var = 3
 
print("value = ", ~var) # which is equal to -4



Hãy để một số 4.

tl; dr ~ lật các bit. Kết quả là dấu hiệu thay đổi.

irb(main):001:0> '%i' % 2
=> "2"
irb(main):002:0> 2
=> 2
0 là một số âm (
irb(main):001:0> '%i' % 2
=> "2"
irb(main):002:0> 2
=> 2
1). Để xuất số âm
irb(main):001:0> '%i' % 2
=> "2"
irb(main):002:0> 2
=> 2
2 in
irb(main):001:0> '%i' % 2
=> "2"
irb(main):002:0> 2
=> 2
3, sau đó bổ sung của hai là
irb(main):001:0> '%i' % 2
=> "2"
irb(main):002:0> 2
=> 2
0:
irb(main):001:0> '%i' % 2
=> "2"
irb(main):002:0> 2
=> 2
5. Số dương là đầu ra như là.
~ flips the bits. As a result the sign changes.
irb(main):001:0> '%i' % 2
=> "2"
irb(main):002:0> 2
=> 2
0 is a negative number (
irb(main):001:0> '%i' % 2
=> "2"
irb(main):002:0> 2
=> 2
1). To output a negative number
irb(main):001:0> '%i' % 2
=> "2"
irb(main):002:0> 2
=> 2
2 prints
irb(main):001:0> '%i' % 2
=> "2"
irb(main):002:0> 2
=> 2
3, then two's complement of
irb(main):001:0> '%i' % 2
=> "2"
irb(main):002:0> 2
=> 2
0:
irb(main):001:0> '%i' % 2
=> "2"
irb(main):002:0> 2
=> 2
5. Positive numbers are output as is.

Có một giá trị nội bộ và biểu diễn chuỗi của nó. Đối với các số nguyên tích cực, về cơ bản chúng trùng khớp:

irb(main):001:0> '%i' % 2
=> "2"
irb(main):002:0> 2
=> 2

Cái sau tương đương với:

irb(main):003:0> 2.to_s
"2"

~ lật các bit của giá trị nội bộ.

irb(main):001:0> '%i' % 2
=> "2"
irb(main):002:0> 2
=> 2
7 là
irb(main):001:0> '%i' % 2
=> "2"
irb(main):002:0> 2
=> 2
8.
irb(main):001:0> '%i' % 2
=> "2"
irb(main):002:0> 2
=> 2
0 là
irb(main):001:0> '%i' % 2
=> "2"
irb(main):002:0> 2
=> 2
1. Hai chấm (
irb(main):003:0> 2.to_s
"2"
1) đại diện cho số lượng vô hạn là ____ 22. Vì bit đáng kể nhất (MSB) của kết quả là
irb(main):003:0> 2.to_s
"2"
2, kết quả là số âm (
irb(main):003:0> 2.to_s
"2"
4). Để xuất số âm
irb(main):001:0> '%i' % 2
=> "2"
irb(main):002:0> 2
=> 2
2 in
irb(main):001:0> '%i' % 2
=> "2"
irb(main):002:0> 2
=> 2
3, sau đó bổ sung cho hai giá trị nội bộ. Bổ sung của Two được tính bằng cách lật các bit, sau đó thêm
irb(main):003:0> 2.to_s
"2"
2. Bổ sung hai của
irb(main):001:0> '%i' % 2
=> "2"
irb(main):002:0> 2
=> 2
1 là
irb(main):003:0> 2.to_s
"2"
9. Như vậy:

irb(main):005:0> '%b' % 2
=> "10"
irb(main):006:0> '%b' % ~2
=> "..101"
irb(main):007:0> ~2
=> -3

Để tổng hợp nó, nó lật các bit, thay đổi dấu hiệu. Để xuất một số âm, nó in

irb(main):001:0> '%i' % 2
=> "2"
irb(main):002:0> 2
=> 2
3, thì
irb(main):005:0> '%b' % 2
=> "10"
irb(main):006:0> '%b' % ~2
=> "..101"
irb(main):007:0> ~2
=> -3
1 (
irb(main):005:0> '%b' % 2
=> "10"
irb(main):006:0> '%b' % ~2
=> "..101"
irb(main):007:0> ~2
=> -3
2).

Lý do tại sao

irb(main):001:0> '%i' % 2
=> "2"
irb(main):002:0> 2
=> 2
2 đầu ra các số âm như vậy, là vì nó coi giá trị được lưu trữ là bổ sung của hai của giá trị tuyệt đối. Nói cách khác, những gì được lưu trữ là
irb(main):001:0> '%i' % 2
=> "2"
irb(main):002:0> 2
=> 2
1. Đó là một số âm, và do đó, đó là một số bổ sung của một số giá trị
irb(main):005:0> '%b' % 2
=> "10"
irb(main):006:0> '%b' % ~2
=> "..101"
irb(main):007:0> ~2
=> -3
5. Để tìm
irb(main):005:0> '%b' % 2
=> "10"
irb(main):006:0> '%b' % ~2
=> "..101"
irb(main):007:0> ~2
=> -3
5, nó thực hiện bổ sung cho
irb(main):001:0> '%i' % 2
=> "2"
irb(main):002:0> 2
=> 2
1. Đó là bổ sung của hai trong số bổ sung
irb(main):005:0> '%b' % 2
=> "10"
irb(main):006:0> '%b' % ~2
=> "..101"
irb(main):007:0> ~2
=> -3
5 của hai. Đó là
irb(main):005:0> '%b' % 2
=> "10"
irb(main):006:0> '%b' % ~2
=> "..101"
irb(main):007:0> ~2
=> -3
5 (ví dụ
irb(main):008:0> '%b' % -3
=> "..101"
irb(main):009:0> '%b' % ~-3
=> "10"
irb(main):010:0> ~-3
=> 2
0).

Trong trường hợp bạn áp dụng ~ vào một số âm, nó chỉ cần lật các bit (tuy nhiên thay đổi dấu hiệu):

irb(main):008:0> '%b' % -3
=> "..101"
irb(main):009:0> '%b' % ~-3
=> "10"
irb(main):010:0> ~-3
=> 2

Điều khó hiểu hơn là

irb(main):008:0> '%b' % -3
=> "..101"
irb(main):009:0> '%b' % ~-3
=> "10"
irb(main):010:0> ~-3
=> 2
2 (hoặc bất kỳ giá trị nào khác với MSB bằng
irb(main):003:0> 2.to_s
"2"
2). Hãy đơn giản hóa nó một chút:
irb(main):008:0> '%b' % -3
=> "..101"
irb(main):009:0> '%b' % ~-3
=> "10"
irb(main):010:0> ~-3
=> 2
4. Đó là bởi vì nó coi
irb(main):008:0> '%b' % -3
=> "..101"
irb(main):009:0> '%b' % ~-3
=> "10"
irb(main):010:0> ~-3
=> 2
5 là một con số dương. Mà thực sự có ý nghĩa. Vì vậy,
irb(main):008:0> '%b' % -3
=> "..101"
irb(main):009:0> '%b' % ~-3
=> "10"
irb(main):010:0> ~-3
=> 2
6. Kết quả là một số âm. Bổ sung hai của
irb(main):008:0> '%b' % -3
=> "..101"
irb(main):009:0> '%b' % ~-3
=> "10"
irb(main):010:0> ~-3
=> 2
7 là
irb(main):008:0> '%b' % -3
=> "..101"
irb(main):009:0> '%b' % ~-3
=> "10"
irb(main):010:0> ~-3
=> 2
8. Vì thế:

irb(main):011:0> '%x' % ~0xf0
=> "..f0f"
irb(main):012:0> (~0xf0).to_s(16)
=> "-f1"

Trong trường hợp bạn sẽ không áp dụng các toán tử bitwise vào kết quả, bạn có thể coi ~ là toán tử

irb(main):011:0> '%x' % ~0xf0
=> "..f0f"
irb(main):012:0> (~0xf0).to_s(16)
=> "-f1"
0:

irb(main):018:0> -2 - 1
=> -3
irb(main):019:0> --3 - 1
=> 2

Nhưng điều đó được cho là không sử dụng nhiều.

Một ví dụ cho rằng bạn đã cung cấp một netmask 8 bit (cho đơn giản) và bạn muốn tính toán số lượng của ________ 51. Bạn có thể tính toán chúng bằng cách lật các bit và gọi

irb(main):011:0> '%x' % ~0xf0
=> "..f0f"
irb(main):012:0> (~0xf0).to_s(16)
=> "-f1"
2 (
irb(main):011:0> '%x' % ~0xf0
=> "..f0f"
irb(main):012:0> (~0xf0).to_s(16)
=> "-f1"
3). Nhưng
irb(main):008:0> '%b' % -3
=> "..101"
irb(main):009:0> '%b' % ~-3
=> "10"
irb(main):010:0> ~-3
=> 2
6, vì vậy chúng tôi phải cắt bỏ các bit không cần thiết:
Let's say you're given a 8-bit (for simplicity) netmask, and you want to calculate the number of
irb(main):011:0> '%x' % ~0xf0
=> "..f0f"
irb(main):012:0> (~0xf0).to_s(16)
=> "-f1"
1's. You can calculate them by flipping the bits and calling
irb(main):011:0> '%x' % ~0xf0
=> "..f0f"
irb(main):012:0> (~0xf0).to_s(16)
=> "-f1"
2 (
irb(main):011:0> '%x' % ~0xf0
=> "..f0f"
irb(main):012:0> (~0xf0).to_s(16)
=> "-f1"
3). But
irb(main):008:0> '%b' % -3
=> "..101"
irb(main):009:0> '%b' % ~-3
=> "10"
irb(main):010:0> ~-3
=> 2
6, so we've got to cut off the unneeded bits:

irb(main):014:0> '%x' % (~0xf0 & 0xff)
=> "f"
irb(main):015:0> (~0xf0 & 0xff).bit_length
=> 4

Hoặc bạn có thể sử dụng toán tử XOR (

irb(main):011:0> '%x' % ~0xf0
=> "..f0f"
irb(main):012:0> (~0xf0).to_s(16)
=> "-f1"
5):

irb(main):016:0> i = 0xf0
irb(main):017:0> '%x' % i ^ ((1 << i.bit_length) - 1)
=> "f"

Làm thế nào để bạn tìm thấy phần bổ sung bitwise của một số trong Python?

Toán tử của Python ~ (bitwise không) trả về phần bổ sung số 1 của số. 14 là (1110) ở dạng nhị phân bổ sung 2 của nó. Ở đây, ~ 14 sẽ đảo ngược (tức là 1 bổ sung) tất cả các bit trong biểu mẫu này thành 0001 ...
Đảo ngược các bit ..
Thêm 1 ..
Chuyển đổi sang thập phân ..
Thêm dấu hiệu tiêu cực ..

Nhà điều hành bổ sung bitwise được tính toán như thế nào?

Toán tử bổ sung bitwise là một toán tử Unary (chỉ hoạt động trên một toán hạng). Phải mất một số và đảo ngược tất cả các bit của nó. Khi toán tử bitwise được áp dụng trên các bit sau đó, tất cả 1 đều trở thành 0 và ngược lại. Toán tử cho bổ sung bitwise là ~ (Tilde).~ (Tilde).

Làm thế nào để Python tính toán các toán tử bitwise?

BitWise và toán tử: Trả về 1 nếu cả hai bit là 1 khác 0. BitWise hoặc Toán tử: Trả về 1 nếu một trong số đó là 1 khác 0. BitWise không vận hành: Trả về số bổ sung của một số.... Các nhà khai thác bitwise ..

Làm thế nào để bạn bổ sung trong Python?

Binary bổ sung cho các số nguyên âm: SO -1 là bổ sung (1 - 1) = bổ sung (0) = "11111111" và -10 là bổ sung (10 - 1) = bổ sung (9) = bổ sung ("00001001") ="11110110".Điều này có nghĩa là các số âm đi tất cả các cách xuống -128 ("10000000").Tất nhiên, Python không sử dụng số 8 bit.-1 is complement(1 - 1) = complement(0) = "11111111", and -10 is complement(10 - 1) = complement(9) = complement("00001001") = "11110110". This means that negative numbers go all the way down to -128 ("10000000"). Of course, Python doesn't use 8-bit numbers.