二進(jìn)制昼蛀,是計(jì)算技術(shù)中廣泛采用的一種數(shù)制雀瓢。也就是說計(jì)算機(jī)中是0和1進(jìn)行計(jì)算的。
在java中int類型是4字節(jié)8比特的數(shù)據(jù)類型酌住。
這里用1和-1來講述原碼店归,補(bǔ)碼和反碼:
原碼
1:00000000 00000000 00000000 00000001
-1:10000000 00000000 00000000 00000001
反碼
1:00000000 00000000 00000000 00000001
-1:111111111 111111111 111111111 11111110
補(bǔ)碼
1:00000000 00000000 00000000 00000001
-1:111111111 111111111 111111111 11111111
總結(jié):
正數(shù)的原碼,反碼酪我,補(bǔ)碼都一樣消痛;負(fù)數(shù)的反碼是通過原碼得到的,最高位還是1都哭,其他位0變1秩伞,1變0;補(bǔ)碼是反碼+1欺矫。
為什么需要反碼和補(bǔ)碼呢纱新?
總而言之?dāng)?shù)字就是用來計(jì)算的,那么:
原碼計(jì)算:1+(-1)=(00000000 00000000 00000000 000000001)+(10000000 00000000 00000000 000000001)=10000000 00000000 00000000 000000002=-2;
明顯錯(cuò)誤穆趴。
反碼計(jì)算:1+(-1)=(00000000 00000000 00000000 00000001)+(111111111 111111111 111111111 11111110)=111111111 111111111 111111111 11111111=-0脸爱;
0沒有正負(fù)之分,所以這也不對未妹。
補(bǔ)碼計(jì)算:1+(-1)=(00000000 00000000 00000000 00000001)+(111111111 111111111 111111111 11111111)=00000000 00000000 00000000 000000000=0;
正確
結(jié)論:
計(jì)算機(jī)的計(jì)算都是通過補(bǔ)碼進(jìn)行計(jì)算的簿废。
java中位計(jì)算(優(yōu)先級(jí)從高到低)
符號(hào) | 含義 | 正數(shù)示例 | 負(fù)數(shù)示例 | 通用算法(x和y未知數(shù)) |
---|---|---|---|---|
~ | 按位非 | ~5=-6 | ~-5=4 | ~x=-x-1 |
<< | 左移位 | 4<<3=32 | -4<<3=-32 | x<<y=x*2的y次方 |
>> | 右移位 | 4>>3=0 | -4<<3=-1 | x>>y=x/2的y次方 |
>>> | 無符號(hào)右移位 | 4>>>3=0 | -4>>>3=536870911 | 俺不知道 |
& | 按位與 | 1&-2=0 | 不弄了 | 俺不知道 |
^ | 按位或異 | 1^-2=-1 | 不弄了 | 俺不知道 |
豎號(hào) | 按位或 | 4豎號(hào)3=-1 | 不弄了 | 俺不知道 |
計(jì)算原則:使用補(bǔ)碼進(jìn)行計(jì)算得到得也是補(bǔ)碼勺疼,最高位是1是負(fù)數(shù),0是正數(shù)捏鱼,再推導(dǎo)成原碼進(jìn)行二進(jìn)制轉(zhuǎn)10進(jìn)制执庐。
-
按位非
1. ~5(0變1,1變0)
5的原碼:00000101
5的反碼:00000101
5的補(bǔ)碼:00000101
對5按位非:11111010
11111010的反碼:11111001
11111001的原碼:10000110
得-6
2. ~-5(0變1导梆,1變0)
-5的原碼:10000101
-5的反碼:11111010
-5的補(bǔ)碼:11111011
對-5按位非:000000101
000000101的反碼:000000101
000000101的原碼:000000101
得4
-
左移位
1. 4<<3(向左移3位轨淌,最低位補(bǔ)0)
4的原碼:00000100
4的反碼:00000100
4的補(bǔ)碼:00000100
00000100向左移3位:00100000
00100000的反碼:00100000
000111111的原碼:00100000
得32
2. -4<<3(向左移3位,低位補(bǔ)0)
-4的原碼:10000100
-4的反碼:11111011
-4的補(bǔ)碼:11111100
11111010向左移3位:11100000
00100000的反碼:11011111
000111111的原碼:10100000
得-32
-
右移位
1. 4>>3(向右移3位看尼,正數(shù)高位補(bǔ)0)
4的原碼:00000100
4的反碼:00000100
4的補(bǔ)碼:00000100
00000100向右移3位:00000000
00100000的反碼:00000000
000111111的原碼:00000000
得0
2. -4>>3(向右移3位递鹉,負(fù)數(shù)高位補(bǔ)1)
-4的原碼:10000100
-4的反碼:11111011
-4的補(bǔ)碼:11111100
11111010向右移3位:11111111
00100000的反碼:11111110
000111111的原碼:10000001
得-1
-
無符號(hào)右移位
1. 4>>>3(向右移3位,高位補(bǔ)0)
4的原碼:00000100
4的反碼:00000100
4的補(bǔ)碼:00000100
00000100向右移3位:00000000
00100000的反碼:00000000
000111111的原碼:00000000
得0(正數(shù)>>>與>>一樣)
2. -4>>>3(向右移3位藏斩,高位補(bǔ)0)
-4的原碼:10000000 00000000 00000000 00000100
-4的反碼:11111111 11111111 11111111 11111011
-4的補(bǔ)碼:11111111 11111111 11111111 11111100
11111010向右移3位:00011111 11111111 11111111 11111111
00100000的反碼:00011111 11111111 11111111 11111111
000111111的原碼:00011111 11111111 11111111 11111111
得536870911
-
按位與
1. 1&-2(0與0為0躏结,0與1為0,1與1為1)
1的原碼:00000001
-2的原碼:10000010
1的反碼:00000001
-2的反碼:11111101
1的補(bǔ)碼:00000001
-2的補(bǔ)碼:11111110
1按位與-2:00000000
00000000反碼:00000000
00000000原碼:00000000
得0
-
按位或異
1. 1^-2(0或異0為0狰域,0或異1為1媳拴,1或異1為0)
1的原碼:00000001
-2的原碼:10000010
1的反碼:00000001
-2的反碼:11111101
1的補(bǔ)碼:00000001
-2的補(bǔ)碼:11111110
1或異-2:11111111
00000000反碼:11111110
00000000原碼:10000001
得-1
-
按位或
1. 1|-2(0或0為0,0或1為1兆览,1或1為1)
1的原碼:00000001
-2的原碼:10000010
1的反碼:00000001
-2的反碼:11111101
1的補(bǔ)碼:00000001
-2的補(bǔ)碼:11111110
1或-2:11111111
00000000反碼:11111110
00000000原碼:10000001
得-1