2010-03-25 36 views
34

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ử

+7

Nếu bạn muốn lật một bit, hãy sử dụng 'x^1'. – kennytm

+1

Đó không phải là toán tử 'không'. Nó là một toán tử 'bổ sung'. – EJP

+1

@EJP: Toán tử bổ sung *** của ***. – kennytm

Trả lời

64

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:

3

~ 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.

1

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 
0

Đó là nghịch đảo nhị phân, và trong bổ sung thứ hai -1 là nghịch đảo nhị phân của 0.

13

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.

7

~ 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 = −128

0 1 1 1 1 1 1 0 = 126
1 0 0 0 0 0 0 1 = −127

1 1 1 1 1 1 1 1 = -1
0 0 0 0 0 0 0 0 = 0

1 1 1 1 1 1 1 0 = -2
0 0 0 0 0 0 0 1 = 1

1 0 0 0 0 0 0 1 = -127
0 1 1 1 1 1 1 0 = 126

1 0 0 0 0 0 0 0 = -128
0 1 1 1 1 1 1 1 = 127

+0

+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

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 ...

0

Đối với 32 bit đã ký số nguyên

~00000000000000000000000000000000=11111111111111111111111111111111 (đó là - 1)

9

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! 
+0

Ví dụ rõ ràng hơn, cảm ơn! –

0

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.

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