title: java基礎知識
tags: [java基礎知識]
位運算符
java種的運算符有 “&”,“|”,“~”,“^”即 “與”、“非”、“或”、“異或”
這幾種運算符都需要將判斷的字符轉換成2進制,
& 且運算符
兩個操作數中位數都為1,結果才為1,否則為0
如 int a = 9;
int b = 10;
9的二進制是1001,10是1010,&的結果是1000 即8
| 或運算符
兩個位數只要一個為1,結果就是1,否則為0
如 int a = 9;
int b = 10;
9的二進制是1001,10是1010,|的結果是1011 即11
~ 非運算符
如果位數為0,結果是1,如果位數為1,結果是0
如 int a = 9;
9的二進制是1001,~的結果是0110 即6
^ 異或運算符
相對應的位 相同則結果為0,不同則結果為1
如 int a = 9;
int b = 10;
9的二進制是1001,10是1010,^的結果是0011 即3
<< 按位左移運算符
左操作數按位左移右操作數指定的位數。
如 20 << 2
20的二進制補碼:0001 0100
>> 按位右移運算符
左操作數按位右移右操作數指定的位數。
一些基礎概念
機器數
一個數在計算機中的二進制表示形式,叫做這個數的機器數,機器數是帶符號的,在計算機用一個數的最高位存放符號, 正數為0, 負數為1
如 1的二進制數計算機字長位8位,二進制就是 0000 0001 , -1就是 1000 0001
真值
因為第一位是符號位,所以機器數的形式值就不等于真正的數值。例如上面的有符號數 1000 0001,其最高位1代表負,其真正數值是 -1 而不是形式值129(1000 0001轉換成十進制等于129)。所以,為區別起見,將帶符號位的機器數對應的真正數值稱為機器數的真值。
所以 0000 0001 的真值為 +000 0001 即 1
1000 0001 的真值為 -000 0001 即 -1
原碼
原碼就是符號位加上真值的絕對值, 即用第一位表示符號, 其余位表示值. 比如如果是8位二進制:
1的原碼 0000 0001
-1的原碼 1000 0001
8位二進制的取值范圍則是[1111 1111, 0111 1111] 即 [-127, 127]
反碼
反碼就是將原碼除符號位以外的值全部取反,原來是1的變為0,原來是0的變為1
正數的反碼是其本身
如1的原碼是: 0000 0001
反碼是: 0000 0001
如-1的原碼是: 1000 0001
反碼是: 1111 1110
補碼
補碼就是在反碼的基礎上,在二進制數的右端末位加1(逢2進1)
正數的補碼就是其本身
如1的原碼是: 0000 0001
反碼是: 0111 1110
補碼是: 0000 0001
如-1的原碼是: 1000 0001
反碼是: 1111 1110
補碼是: 1111 1111
移位運算
左移
數值的補碼全部往左移動X位,符號位和最高位都舍棄,最低位補0
如 int a = 6;
int b = a << 2;
6的補碼: [0000 0000 0000 0000 0000 0000 0000 0110]
結果: [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的補碼: [1111 1111 1111 1111 1111 1111 1111 1010]
-6的左移動2位: [1111 1111 1111 1111 1111 1111 1110 1000]
然后將補碼轉成原碼: 先補碼的反碼再加1
即 [1000 0000 0000 0000 0000 0000 0001 0111] =》 [1000 0000 0000 0000 0000 0000 0001 1000]
結果為 -24
左移n位就相當于乘以2的n次方
右移
數值的補碼向右移X位,符號位不變(左邊補上符號位)
int a=8
int b=a>> 2
8的原碼 [0000 0000 0000 0000 0000 0000 0000 1000]
8向右移動兩位 [0000 0000 0000 0000 0000 0000 0000 0010]
結果為 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的補碼 [1111 1111 1111 1111 1111 1111 1111 1000]
-8向右移動兩位 [1111 1111 1111 1111 1111 1111 1111 1110]
然后取補碼的反碼 [1000 0000 0000 0000 0000 0000 0000 0001]
補碼的原碼 [1000 0000 0000 0000 0000 0000 0000 0010]
結果為 -2