起因
刷題碰到的問題薪寓,給定兩個int類型的整數(shù),然后不使用+
計算兩個數(shù)的和
不使用加號澜共,就只能使用位運算符了向叉,所以趁著機會徹底摟清楚位運算符的用法了
基礎(chǔ)的代碼實現(xiàn)##
/**
* @param a: An integer
* @param b: An integer
* @return: The sum of a and b
*/
public static int aplusb(int a, int b) {
if(b == 0 )
return a;
int sum = a^b;
int carry = (a&b)<<1;
return aplusb(sum,carry);
}
十進制轉(zhuǎn)二進制
原理
給定的數(shù)循環(huán)除以2,直到商為0或者1為止嗦董。將每一步除的結(jié)果的余數(shù)記錄下來母谎,然后反過來就得到相應(yīng)的二進制了
比如8轉(zhuǎn)二進制,第一次除以2等于4(余數(shù)0)京革,第二次除以2等于2(余數(shù)0)奇唤,第三次除以2等于1(余數(shù)0),最后余數(shù)1匹摇,得到的余數(shù)依次是0 0 0 1
反過來就是1000咬扇,計算機內(nèi)部表示數(shù)的字節(jié)長度是固定的,比如8位廊勃,16位懈贺,32位
所以在高位補齊,java中字節(jié)碼是8位的供搀,所以高位補齊就是00001000
寫法為(8)10=(00001000)2
代碼實現(xiàn)
public class mapHashCodeTest {
public static void main(String[] args) {
String str = toBinary(8);
System.out.println(str);
}
static String toBinary(int num) {
String str = "";
while (num != 0) {
str = num % 2 + str;
num = num / 2;
}
return str;
}
}
二進制轉(zhuǎn)十進制
原理
比如8的二進制表示位00001000隅居,去掉補齊的高位就是1000
此時從個位開始計算2的冪(個位是0,依次往后推)乘以對應(yīng)位數(shù)上的數(shù)葛虐,然后得到的值想加
于是有了胎源,(2的0次冪)0+(2的1次冪) 0+(2的2次冪)0+(2的3次冪) 1 = 8
代碼實現(xiàn),直接調(diào)用Integer.parseInt("",2);
System.out.println(Integer.parseInt("1000",2));
運行結(jié)果:8
位<<異或>>運算(^)
運算規(guī)則
兩個數(shù)轉(zhuǎn)為二進制屿脐,然后從高位開始比較
如果相同則為0涕蚤,不相同則為1
比如:8^11.
8轉(zhuǎn)為二進制是1000,11轉(zhuǎn)為二進制是1011.從高位開始比較得到的是:0011.然后二進制轉(zhuǎn)為十進制的诵,就是Integer.parseInt("0011",2)=3;
位<<與>>運算符(&)
運算規(guī)則
兩個數(shù)都轉(zhuǎn)為二進制万栅,然后從高位開始比較
如果兩個數(shù)都為1則為1,否則為0
例子
比如:129&128.
129轉(zhuǎn)換成二進制就是10000001西疤,128轉(zhuǎn)換成二進制就是10000000烦粒。從高位開始比較得到,得到10000000,即128.
位<<或>>運算符(|)
運算規(guī)則
兩個數(shù)都轉(zhuǎn)為二進制扰她,然后從高位開始比較
兩個數(shù)只要有一個為1則為1兽掰,否則就為0
例子
比如:129|128.
129轉(zhuǎn)換成二進制就是10000001,128轉(zhuǎn)換成二進制就是10000000徒役。從高位開始比較得到孽尽,得到10000001,即129.
位<<非>>運算符(~)
運算規(guī)則
如果位為0忧勿,結(jié)果是1杉女,如果位為1,結(jié)果是0.
比如:~7,對7的二進制進行取反
7 轉(zhuǎn)為二進制是111
原碼為:00000000 00000000 00000000 00000111
反碼為:11111111 11111111 11111111 11111000
所以~7 的結(jié)果為-8
Java中負(fù)數(shù)的表示##
~7 補碼反碼加一即為(-8+1)為:11111111 11111111 11111111 11111001
-7 在計算機內(nèi)部就表示為7的補碼
通過-7 的二進制碼計算7的二進制表示
減一為:11111111 11111111 11111111 11111000
取反為:00000000 00000000 00000000 00000111
參考資料
http://www.ruanyifeng.com/blog/2009/08/twos_complement.html
最后編輯于 :2018.03.06 11:24:09
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者