Tại sao hoạt động bitwise (~0);
in -1? Trong dạng nhị phân, không phải 0 phải là 1. tại sao ?bitwise không phải là toán tử
Trả lời
Bạn thực sự khá gần.
Trong nhị phân, không phải 0 nên 1
Vâng, đây là hoàn toàn chính xác khi chúng ta đang nói về một chút.
BAO GIỜ, một số int
có giá trị bằng 0 thực sự là 32 bit của tất cả các số không! ~
chuyển đổi tất cả 32 số không thành 32 số.
System.out.println(Integer.toBinaryString(~0));
// prints "11111111111111111111111111111111"
Đây là đại diện bổ sung của hai là -1
.
Tương tự:
System.out.println(Integer.toBinaryString(~1));
// prints "11111111111111111111111111111110"
Đó là, đối với một 32-bit unsigned int
trong đại diện bổ sung hai nhân, ~1 == -2
.
Tiếp tục đọc:
- Two's complement
- Đây là hệ thống được sử dụng bởi Java (trong số những người khác) để đại diện cho ký giá trị số theo bit
- JLS 15.15.5 Bitwise complement operator
~
- "lưu ý rằng, trong mọi trường hợp,
~x
bằng(-x)-1
"
- "lưu ý rằng, trong mọi trường hợp,
Vì ~
không đảo ngược nhị phân, đảo ngược bit. Đảo ngược nhị phân sẽ là !
và có thể (trong Java) chỉ được áp dụng cho các giá trị boolean.
Trong mã hóa nhị phân chuẩn, 0 là tất cả 0, ~
là bitwise NOT. Tất cả 1s là (thường xuyên nhất) -1 cho các loại số nguyên đã ký. Vì vậy, cho một loại byte ký:
0xFF = -1 // 1111 1111
0xFE = -2 // 1111 1110
...
0xF0 = -128 // 1000 0000
0x7F = 127 // 0111 1111
0x7E = 126 // 0111 1110
...
0x01 = 1 // 0000 0001
0x00 = 0 // 0000 0000
Đó là nghịch đảo nhị phân, và trong bổ sung thứ hai -1 là nghịch đảo nhị phân của 0.
gì bạn đang thực sự nói là ~ 0x00000000 và có kết quả trong 0xFFFFFFFF. Đối với một int (đã ký) trong java, điều đó có nghĩa là -1.
~
là một toán tử bitwise.
~0 = 1 which is -1 in 2's complement form
http://en.wikipedia.org/wiki/Two's_complement
Một số con số trong hình thức bổ sung hai và chút khôn ngoan không ~
(ngay dưới họ) của họ:
0 1 1 1 1 1 1 1 = 127
1 0 0 0 0 0 0 0 = −1280 1 1 1 1 1 1 0 = 126
1 0 0 0 0 0 0 1 = −1271 1 1 1 1 1 1 1 = -1
0 0 0 0 0 0 0 0 = 01 1 1 1 1 1 1 0 = -2
0 0 0 0 0 0 0 1 = 11 0 0 0 0 0 0 1 = -127
0 1 1 1 1 1 1 0 = 1261 0 0 0 0 0 0 0 = -128
0 1 1 1 1 1 1 1 = 127
+1 cho ví dụ rõ ràng. Các lập trình viên thích câu đố có thể tìm ra cả hai cách hoạt động và cách bổ sung của hai hoạt động chỉ từ việc nghiên cứu kỹ ví dụ của bạn! –
0 ở đây không phải là một chút. Nó là một byte (ít nhất; hoặc hơn) - 00000000. Sử dụng bitwise hoặc chúng tôi sẽ có 11111111. nó là -1 như đã ký số nguyên ...
Đối với 32 bit đã ký số nguyên
~00000000000000000000000000000000=11111111111111111111111111111111
(đó là - 1)
Bạn có thể tưởng tượng bit đầu tiên trong một số đã ký là - (2 x -1) trong đó x là số bit.
Vì vậy, với một số 8-bit, giá trị của mỗi bit (từ trái sang trật tự bên phải) là:
-128 64 32 16 8 4 2 1
Bây giờ, trong nhị phân, 0 rõ ràng là tất cả 0s:
-128 64 32 16 8 4 2 1
0 0 0 0 0 0 0 0 0 = 0
Và khi bạn làm Bitwise không ~
mỗi một trong các 0s trở thành một 1:
-128 64 32 16 8 4 2 1
~0 1 1 1 1 1 1 1 1
= -128+64+32+16+8+4+2+1 == -1
Đây cũng là hữu ích i n hiểu tràn:
-128 64 32 16 8 4 2 1
126 0 1 1 1 1 1 1 0 = 126
+1 0 1 1 1 1 1 1 1 = 127
+1 1 0 0 0 0 0 0 0 = -128 overflow!
Ví dụ rõ ràng hơn, cảm ơn! –
Tôi nghĩ lý do thực sự là ~ là Complement Hai của.
Javascript chỉ định dấu ngã ký tự, ~, cho phần bổ sung của hai, mặc dù trong hầu hết các ngôn ngữ lập trình, dấu ngã biểu thị một chút chuyển đổi cho phần bổ sung của một người.
- 1. Sử dụng toán tử Bitwise trên cờ
- 2. KHÔNG phải là toán tử KHÔNG trong C#
- 3. Tuyên bố có điều kiện sử dụng toán tử bitwise
- 4. Khi nào tôi nên sử dụng toán tử bitwise?
- 5. Một số câu hỏi về các toán tử bitwise
- 6. Toán tử bitwise để lấy byte từ 32 bit
- 7. toán tử Boolean vs nhà khai thác Bitwise
- 8. HQL để CriteriaQuery khi sử dụng toán tử Bitwise
- 9. Thuật toán cho bitwise fiddling
- 10. Toán tử không phải (!!) trong PHP
- 11. Tìm số chẵn/lẻ mà không sử dụng toán tử/bitwise
- 12. Thế nào là | và^toán tử được sử dụng cho?
- 13. Tại sao không phải là toán tử [] const cho các bản đồ STL?
- 14. Kết quả của toán tử bậc ba không phải là rvalue
- 15. Tại sao bitwise OR toán tử được sử dụng trong cờ enum với ý nghĩa VÀ
- 16. Có sự khác biệt nào giữa việc sử dụng toán tử logic hoặc toán tử bitwise trong một khối if trong Java không?
- 17. sử dụng các toán tử bitwise để đóng gói nhiều giá trị trong một int
- 18. Làm thế nào để thực hiện Bitcount chỉ sử dụng các toán tử Bitwise?
- 19. Các toán tử bitwise và chuyển đổi một int thành 2 byte và ngược lại
- 20. Các toán tử Java: | = \t bitwise OR và gán ví dụ
- 21. Tạo mẫu bit cụ thể bằng cách sử dụng toán tử bitwise
- 22. Kiểm tra xem một số có dương hay âm bằng cách sử dụng toán tử bitwise
- 23. Cần giúp đỡ tìm hiểu cách sử dụng các toán tử Bitwise
- 24. Làm thế nào để tạo biểu thức động với một toán tử bitwise và enums?
- 25. C++ hợp lý & toán tử
- 26. Toán tử || = đứng trong Ruby là gì?
- 27. Hoạt động bitwise trên số không
- 28. Lỗi "Thiếu toán hạng sau 'toán tử Bannon' - toán tử 'Bannon' là gì?
- 29. Toán tử # :: có nghĩa là gì?
- 30. Tầm quan trọng của toán tử quá tải -() là hàm miễn phí và không phải là hàm thành viên?
Nếu bạn muốn lật một bit, hãy sử dụng 'x^1'. – kennytm
Đó không phải là toán tử 'không'. Nó là một toán tử 'bổ sung'. – EJP
@EJP: Toán tử bổ sung *** của ***. – kennytm