從一個簡單的例子看:
int a = 10;
a = ~a;
System.out.println(a);
int b = -10;
b = ~b;
System.out.println(b);
out:
-11
9
感覺 x = ~x;的結果是 -x-1
運算過程:
java int 是兩個字節的,所以如下表:
第一波~
過程說明 | 二進制 | 結果 |
---|---|---|
10的原碼、反碼、補碼一致 | 0000 0000 0000 0000 0000 0000 0000 1010 | 10 |
~10 按位取反 | 1111? 1111 ?1111? 1111 1111? 1111? 1111? 0101 | |
賦值的時候,二進制首位是1, 所以將其當做負數來處理,即 將上一步的二進制當做補碼處 理,需要恢復原碼,在來一波 按位取反,末尾加一 |
1000 0000 0000 0000 0000 0000 0000 1011 | -11 |
又一波~
過程說明 | 二進制 | 結果 |
---|---|---|
-10的補碼 | 1111? 1111? 1111? 1111 1111? 1111 ? 1111 0110 | -10 |
~(-10) 按位取反 | 0000 0000 0000 0000 0000 0000 0000 1001 | 9 |
賦值的時候,二進制首位是0, 所以將其當做正數來處理,而 正數的補碼與原碼一致,不用 處理 |
0000 0000 0000 0000 0000 0000 0000 1001 | 9 |
注意點:數據在存儲的時候,以其補碼為準