一個不讓用加號的需求而引發(fā)的Java位運算詳解

起因

  • 刷題碰到的問題薪寓,給定兩個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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末鸳吸,一起剝皮案震驚了整個濱河市熏挎,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌层释,老刑警劉巖婆瓜,帶你破解...
    沈念sama閱讀 222,104評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異贡羔,居然都是意外死亡廉白,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評論 3 399
  • 文/潘曉璐 我一進店門乖寒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來猴蹂,“玉大人,你說我怎么就攤上這事楣嘁“跚幔” “怎么了?”我有些...
    開封第一講書人閱讀 168,697評論 0 360
  • 文/不壞的土叔 我叫張陵逐虚,是天一觀的道長聋溜。 經(jīng)常有香客問我,道長叭爱,這世上最難降的妖魔是什么撮躁? 我笑而不...
    開封第一講書人閱讀 59,836評論 1 298
  • 正文 為了忘掉前任,我火速辦了婚禮买雾,結(jié)果婚禮上把曼,老公的妹妹穿的比我還像新娘。我一直安慰自己漓穿,他們只是感情好嗤军,可當(dāng)我...
    茶點故事閱讀 68,851評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著晃危,像睡著了一般叙赚。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,441評論 1 310
  • 那天纠俭,我揣著相機與錄音沿量,去河邊找鬼。 笑死冤荆,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的权纤。 我是一名探鬼主播钓简,決...
    沈念sama閱讀 40,992評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼汹想!你這毒婦竟也來了外邓?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,899評論 0 276
  • 序言:老撾萬榮一對情侶失蹤古掏,失蹤者是張志新(化名)和其女友劉穎损话,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體槽唾,經(jīng)...
    沈念sama閱讀 46,457評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡丧枪,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,529評論 3 341
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了庞萍。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片拧烦。...
    茶點故事閱讀 40,664評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖钝计,靈堂內(nèi)的尸體忽然破棺而出恋博,到底是詐尸還是另有隱情,我是刑警寧澤私恬,帶...
    沈念sama閱讀 36,346評論 5 350
  • 正文 年R本政府宣布债沮,位于F島的核電站,受9級特大地震影響本鸣,放射性物質(zhì)發(fā)生泄漏疫衩。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,025評論 3 334
  • 文/蒙蒙 一永高、第九天 我趴在偏房一處隱蔽的房頂上張望隧土。 院中可真熱鬧,春花似錦命爬、人聲如沸曹傀。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,511評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽皆愉。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間幕庐,已是汗流浹背久锥。 一陣腳步聲響...
    開封第一講書人閱讀 33,611評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留异剥,地道東北人瑟由。 一個月前我還...
    沈念sama閱讀 49,081評論 3 377
  • 正文 我出身青樓,卻偏偏與公主長得像冤寿,于是被迫代替她去往敵國和親歹苦。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,675評論 2 359