title: java基礎(chǔ)知識(shí)
tags: [java基礎(chǔ)知識(shí)]
位運(yùn)算符
java種的運(yùn)算符有 “&”,“|”,“~”,“^”即 “與”滔吠、“非”、“或”、“異或”
這幾種運(yùn)算符都需要將判斷的字符轉(zhuǎn)換成2進(jìn)制,
& 且運(yùn)算符
兩個(gè)操作數(shù)中位數(shù)都為1伐割,結(jié)果才為1,否則為0
如 int a = 9;
int b = 10;
9的二進(jìn)制是1001刃唤,10是1010口猜,&的結(jié)果是1000 即8
| 或運(yùn)算符
兩個(gè)位數(shù)只要一個(gè)為1,結(jié)果就是1透揣,否則為0
如 int a = 9;
int b = 10;
9的二進(jìn)制是1001,10是1010川抡,|的結(jié)果是1011 即11
~ 非運(yùn)算符
如果位數(shù)為0辐真,結(jié)果是1须尚,如果位數(shù)為1,結(jié)果是0
如 int a = 9;
9的二進(jìn)制是1001侍咱,~的結(jié)果是0110 即6
^ 異或運(yùn)算符
相對(duì)應(yīng)的位 相同則結(jié)果為0耐床,不同則結(jié)果為1
如 int a = 9;
int b = 10;
9的二進(jìn)制是1001,10是1010楔脯,^的結(jié)果是0011 即3
<< 按位左移運(yùn)算符
左操作數(shù)按位左移右操作數(shù)指定的位數(shù)撩轰。
如 20 << 2
20的二進(jìn)制補(bǔ)碼:0001 0100
>> 按位右移運(yùn)算符
左操作數(shù)按位右移右操作數(shù)指定的位數(shù)。
一些基礎(chǔ)概念
機(jī)器數(shù)
一個(gè)數(shù)在計(jì)算機(jī)中的二進(jìn)制表示形式昧廷,叫做這個(gè)數(shù)的機(jī)器數(shù)堪嫂,機(jī)器數(shù)是帶符號(hào)的,在計(jì)算機(jī)用一個(gè)數(shù)的最高位存放符號(hào), 正數(shù)為0, 負(fù)數(shù)為1
如 1的二進(jìn)制數(shù)計(jì)算機(jī)字長(zhǎng)位8位木柬,二進(jìn)制就是 0000 0001 皆串, -1就是 1000 0001
真值
因?yàn)榈谝晃皇欠?hào)位,所以機(jī)器數(shù)的形式值就不等于真正的數(shù)值眉枕。例如上面的有符號(hào)數(shù) 1000 0001恶复,其最高位1代表負(fù),其真正數(shù)值是 -1 而不是形式值129(1000 0001轉(zhuǎn)換成十進(jìn)制等于129)速挑。所以谤牡,為區(qū)別起見,將帶符號(hào)位的機(jī)器數(shù)對(duì)應(yīng)的真正數(shù)值稱為機(jī)器數(shù)的真值姥宝。
所以 0000 0001 的真值為 +000 0001 即 1
1000 0001 的真值為 -000 0001 即 -1
原碼
原碼就是符號(hào)位加上真值的絕對(duì)值, 即用第一位表示符號(hào), 其余位表示值. 比如如果是8位二進(jìn)制:
1的原碼 0000 0001
-1的原碼 1000 0001
8位二進(jìn)制的取值范圍則是[1111 1111, 0111 1111] 即 [-127, 127]
反碼
反碼就是將原碼除符號(hào)位以外的值全部取反翅萤,原來(lái)是1的變?yōu)?,原來(lái)是0的變?yōu)?
正數(shù)的反碼是其本身
如1的原碼是: 0000 0001
反碼是: 0000 0001
如-1的原碼是: 1000 0001
反碼是: 1111 1110
補(bǔ)碼
補(bǔ)碼就是在反碼的基礎(chǔ)上伶授,在二進(jìn)制數(shù)的右端末位加1(逢2進(jìn)1)
正數(shù)的補(bǔ)碼就是其本身
如1的原碼是: 0000 0001
反碼是: 0111 1110
補(bǔ)碼是: 0000 0001
如-1的原碼是: 1000 0001
反碼是: 1111 1110
補(bǔ)碼是: 1111 1111
移位運(yùn)算
左移
數(shù)值的補(bǔ)碼全部往左移動(dòng)X位断序,符號(hào)位和最高位都舍棄,最低位補(bǔ)0
如 int a = 6;
int b = a << 2;
6的補(bǔ)碼: [0000 0000 0000 0000 0000 0000 0000 0110]
結(jié)果: [0000 0000 0000 0000 0000 0000 0001 1000] 即24
int a = -6;
int b = a << -6
-6的原碼: [1000 0000 0000 0000 0000 0000 0000 0110]
-6的反碼: [1111 1111 1111 1111 1111 1111 1111 1001]
-6的補(bǔ)碼: [1111 1111 1111 1111 1111 1111 1111 1010]
-6的左移動(dòng)2位: [1111 1111 1111 1111 1111 1111 1110 1000]
然后將補(bǔ)碼轉(zhuǎn)成原碼: 先補(bǔ)碼的反碼再加1
即 [1000 0000 0000 0000 0000 0000 0001 0111] =》 [1000 0000 0000 0000 0000 0000 0001 1000]
結(jié)果為 -24
左移n位就相當(dāng)于乘以2的n次方
右移
數(shù)值的補(bǔ)碼向右移X位糜烹,符號(hào)位不變(左邊補(bǔ)上符號(hào)位)
int a=8
int b=a>> 2
8的原碼 [0000 0000 0000 0000 0000 0000 0000 1000]
8向右移動(dòng)兩位 [0000 0000 0000 0000 0000 0000 0000 0010]
結(jié)果為 2
int a=-8
int b=a>> 2
-8的原碼 [0000 0000 0000 0000 0000 0000 0000 1000]
-8的反碼 [1111 1111 1111 1111 1111 1111 1111 0111]
-8的補(bǔ)碼 [1111 1111 1111 1111 1111 1111 1111 1000]
-8向右移動(dòng)兩位 [1111 1111 1111 1111 1111 1111 1111 1110]
然后取補(bǔ)碼的反碼 [1000 0000 0000 0000 0000 0000 0000 0001]
補(bǔ)碼的原碼 [1000 0000 0000 0000 0000 0000 0000 0010]
結(jié)果為 -2