一個不讓用加號的需求而引發的Java位運算詳解
起因
刷題碰到的問題,給定兩個int型別的整數,然後不使用
+
計算兩個數的和不使用加號,就只能使用位運算子了,所以趁著機會徹底摟清楚位運算子的用法了
基礎的程式碼實現##
/** * @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); }
十進位制轉二進位制
原理
給定的數迴圈除以2,直到商為0或者1為止。將每一步除的結果的餘數記錄下來,然後反過來就得到相應的二進位制了
比如8轉二進位制,第一次除以2等於4(餘數0),第二次除以2等於2(餘數0),第三次除以2等於1(餘數0),最後餘數1,得到的餘數依次是0 0 0 1
反過來就是1000,計算機內部表示數的位元組長度是固定的,比如8位,16位,32位
所以在高位補齊,java中位元組碼是8位的,所以高位補齊就是00001000
寫法為(8)10=(00001000)2
程式碼實現
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; } }
二進位制轉十進位制
原理
比如8的二進位制表示位00001000,去掉補齊的高位就是1000
此時從個位開始計算2的冪(個位是0,依次往後推)乘以對應位數上的數,然後得到的值想加
於是有了,(2的0次冪)0+(2的1次冪)0+(2的2次冪)0+(2的3次冪)1 = 8
程式碼實現,直接呼叫
Integer.parseInt("",2);
System.out.println(Integer.parseInt("1000",2));
執行結果:8
位<<異或>>運算(^)
運算規則
兩個數轉為二進位制,然後從高位開始比較
如果相同則為0,不相同則為1
比如:8^11.
8轉為二進位制是1000,11轉為二進位制是1011.從高位開始比較得到的是:0011.然後二進位制轉為十進位制,就是Integer.parseInt("0011",2)=3;
位<<與>>運算子(&)
運算規則
兩個數都轉為二進位制,然後從高位開始比較
如果兩個數都為1則為1,否則為0
例子
比如:129&128.
129轉換成二進位制就是10000001,128轉換成二進位制就是10000000。從高位開始比較得到,得到10000000,即128.
位<<或>>運算子(|)
運算規則
兩個數都轉為二進位制,然後從高位開始比較
兩個數只要有一個為1則為1,否則就為0
例子
比如:129|128.
129轉換成二進位制就是10000001,128轉換成二進位制就是10000000。從高位開始比較得到,得到10000001,即129.
位<<非>>運算子(~)
運算規則
如果位為0,結果是1,如果位為1,結果是0.
比如:~7,對7的二進位制進行取反
7轉為二進位制是111
原碼為:00000000 00000000 00000000 00000111
反碼為:11111111 11111111 11111111 11111000
所以~7的結果為-8
Java中負數的表示##
~7補碼反碼加一即為(-8+1)為:11111111 11111111 11111111 11111001
-7在計算機內部就表示為7的補碼
透過-7的二進位制碼計算7的二進位制表示
減一為:11111111 11111111 11111111 11111000
取反為:00000000 00000000 00000000 00000111
作者:天下無敵強
連結:
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/3034/viewspace-2818362/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- MySQL 中一個雙引號的錯位引發的血案MySql
- (位運算)兩個字串的位運算字串
- 一個小需求引發的思考
- 事故現場:MySQL 中一個雙引號的錯位引發的血案MySql
- Java中的位運算Java
- 位運算的應用
- Java是64位計算最大的需求Java
- 一個分號引發的思考
- 實用的位運算應用
- 位運算(一):二進位制中1的個數
- 我們必須要了解的Java位運算(不僅限於Java)Java
- 位運算實現加減乘除
- Java中的按位取反運算子,哪位能詳解一下?Java
- 一個單引號引發的 MySQL 效能損失MySql
- 位運算--求一個 數二進位制中1的個數
- ?【圖】用圖片告訴你Java中的位運算Java
- 詳解 javascript 的 delete 運算JavaScriptdelete
- 第一個spark應用開發詳解(java版)SparkJava
- 如何用位運算實現整數的加減法
- 從一個加減法運算程式碼理解特殊運算子的過載
- grep 後加單引號、雙引號和不加引號的區別
- 用位運算為你的程式加速
- Java位運算小節Java
- JavaScript數字每隔三位加一個逗號JavaScript
- 三個數字的加減乘除模運算
- 一個需求分析做的不夠的案例
- 談談位運算和在Android中的運用Android
- Java的位運算子詳解例項——與(&)、非(~)、或(|)、異或(^)Java
- JS逗號運算子的用法詳解JS
- 如何巧妙著運用「位運算」來解決問題?
- java二進位制運算十進位制(精確運算)Java
- iOS 開發 – 位運算iOS
- 新增一個索引,而不影響其他應用索引
- 二進位制運算加減乘除+快速冪
- 請寫一個整數計算器,支援加減乘三種運算和括號。Python版本Python
- java位運算子的應用範圍Java
- 什麼?你還不會用位運算來操作狀態?
- JS中的位運算JS