先看一個代碼吧:
int h; return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
這個應該很熟悉吧,是 java?里 HashMap?的計算 hash?值的方法.這里有一個運算符 "^",他其實就是使用補碼來運算的.好了,那么我們下面來說說這些吧:
>原碼。就是當前數字的二進制表現形式,如-1的原碼是1000 0001。>反碼正數的反碼就是本身。負數的反碼是二進制保留符號位。剩余位取反,比如-1的反碼是1111 1110;>補碼正數的反碼、補碼、原碼都是一樣的,負數的補碼是在其反碼的基礎上+1,比如-1的補碼是1111 1111。正數的原碼、反碼、補碼都相同。負數的反碼是除符合位為1外,其他位全取反,簡單地說,負數求補碼,“反碼加1“。 這句話是不負責任的,因為原碼、反碼和補碼概念中,存在符號位,總結一下,”取反加1“時符號位怎么辦:1)取反時,符號位不參與取反。2)加1時,符號位參與加1。3)特殊補碼,即首位為1,其它位全是0。對于這種形式的補碼,不要去求它的原碼了,求出來也不對,它就表示該類型中的最小負數,比如10000000表示byte類型中的最小負數-128。已知一個數的補碼,求原碼的操作分兩種情況:1)如果補碼的符號位為“0”,表示是一個正數,所以補碼就是該數的原碼.2)如果補碼的符號位為“1”,表示是一個負數,求原碼的操作可以是:符號位為1,其余各位取 反,然后再整個數加1.例如,已知一個補碼為11111001,則原碼是10000111(-7):因為符號位為“1”,表示是一個負數,所以該位不變,仍為“1”;其余7位1111001取反后為0000110;再加1,所以是10000111.java有7種位運算符:與(&),或(|),異或(^),取反(~),左移(<<),有符號右移(>>),無符號右移(>>>)。 這7種位運算符,運算時,符號位都要參與運算。具體的規則如下:& 如果相對應位都是1,則結果為1,否則為0 (A&B),得到12,即0000 1100| 如果相對應位都是0,則結果為0,否則為1 (A | B)得到61,即 0011 1101^ 如果相對應位值相同,則結果為0,否則為1 (A ^ B)得到49,即 0011 0001? 按位補運算符翻轉操作數的每一位,即0變成1,1變成0。 (?A)得到-61,即1100 0011<< 按位左移運算符。左操作數按位左移右操作數指定的位數。 A << 2得到240,即 1111 0000>> 按位右移運算符。左操作數按位右移右操作數指定的位數。 A >> 2得到15即 1111>>>按位右移補零操作符。左操作數的值按右操作數指定的位數右移,移動得到的空位以零填充。 A>>>2得到15即0000 1111//1.& int a = 10,b = 6; /*** a = 10 > 00000000 00000000 00000000 00001010* b = 6 > 00000000 00000000 00000000 00000110* &* 2 > 00000000 00000000 00000000 00000010*/ System.out.println(Integer.toBinaryString(a)); System.out.println(Integer.toBinaryString(b)); System.out.println(a & b);a = -10; b = -6;/*** a = -10 > 11111111 11111111 11111111 11110110* b = -6 > 11111111 11111111 11111111 11111010* &* r = -14 > 11111111 11111111 11111111 11110010*///-10 // 原碼 10000000 00000000 00000000 00001010 // 反碼 11111111 11111111 11111111 11110101 // 補碼 11111111 11111111 11111111 11110110//-6 // 原碼 10000000 00000000 00000000 00000110 // 反碼 11111111 11111111 11111111 11111001 // 補碼 11111111 11111111 11111111 11111010// -14 // 原碼 10000000 0000000 00000000 00001110 // 反碼 11111111 1111111 11111111 11110001 // 補碼 11111111 1111111 11111111 11110010 System.out.println("a = " + a + ",補碼是:" + Integer.toBinaryString(a)); System.out.println("b = " + b + " ,補碼是:" + Integer.toBinaryString(b)); System.out.println("a ^ b is:" + (a & b)); System.out.println("結果的補碼是:" + Integer.toBinaryString(-14));
?