java 位操作符

2021-07-23 00:00:37 字數 1951 閱讀 6999

位運算的應用場景:

因為位運算的運算效率比直接對數字進行加減乘除高很多,所以當出現以下情景且對運算效率要求較高時,可以考慮使用位運算。

情況1:

輸入乙個int型的正整數,計算出該int型資料在記憶體中儲存時1的個數。例如輸入5,因為5 的二進位制表示為101,所以輸出為2.

解題思路:普通方法是將5轉換成二進位制的形式,然後再遍歷該二進位制字串,如果是1,則計數count加1

public static int tobinary(int m)   

}return count;

}

如果用位運算,則

數字在記憶體中 ,被轉化為二進位制。

例如7表示為0111,

n&(n-1) 即(0111)&(0110)== 0110 就是 n去除了最後乙個1 ;

幾個1 就可以在幾次內 去除幾個1;

public class main 

system.out.println(count);}}

}

情況2;

兩個int32整數m和n的二進位制表達,有多少個位(bit)不同麼? 例如輸入為1999和 2299,因為兩個的二進位制分別表示為

11111001111和

1000011111011,所以輸出為7.

思路1:是兩個數轉換成二進位制之後,位數若不相等,則短的那個前面補0,使兩個二進位制的位數相等,然後在依次判斷每一位上的數字是否相等,若相等則count加1;

public static int countbitdiff(int m, int n) 

if (ms.length() > ns.length() )

diff--;

} //轉換成陣列,然後每個位進行比較

char sm = ms.tochararray();

char sn = ns.tochararray();

for (int i = 0; i < sn.length; i++)

} return count;

}

思路2: 使用

異或運算。異或運算子是用符號「^」表示的,其運算規律是:兩個運算元的位中,相同則結果為0,不同則結果為1。

將兩個數進行

異或操作後的結果轉換成二進位制形式,然後計算該二進位制有多少個1,即有多少位不同

public  static int count(int m, int n)

} return count;

}

其他操作:參考

1.  判斷int型變數a是奇數還是偶數    

a&1  = 0 偶數 

a&1 =  1 奇數 

2.  求平均值,比如有兩個int型別變數x、y,首先要求x+y的和,再除以2,但是有可能x+y的結果會超過int的最大表示範圍,所以位運算就派上用場啦。

(x&y)+((x^y)>>1); 

3.  對於乙個大於0的整數,判斷它是不是2的幾次方

((x&(x-1))==0)&&(x!=0); 

4.  比如有兩個int型別變數x、y,要求兩者數字交換,位運算的實現方法:效能絕對高效

x ^= y; 

y ^= x; 

x ^= y; 

5. 求絕對值

int abs( int x ) 

6.  取模運算,採用位運算實現:

a % (2^n) 等價於 a & (2^n - 1) 

7.  乘法運算   採用位運算實現

a * (2^n) 等價於 a << n

8.   除法運算轉化成位運算

a / (2^n) 等價於 a>> n 

9.   求相反數

(~x+1) 

10  a % 2 等價於 a & 1 

java位操作符

無符號右移位操作符 在將bit串右移位時,從bit串的最左邊填充0,這和帶符號右移位操作符 不同。在將bit串右移位時,從bit串的最左邊填充原來最左邊的位。也就是說,bit串原來最左邊的位是符號位,如果為1,則在帶符號右移時最左邊始終填充1 如果為0,則在帶符號右移時最左邊始終填充0。移位操作符的...

理解java位操作符

最近的工作需要大量的採用位操作符的 其實專案本身沒有這樣的需求,不過現在我的職責是維護同事的 而這位同事的偏好是採用位操作,沒辦法學習了。無符號右移位操作符 在將bit串右移位時,從bit串的最左邊填充0,這和帶符號右移位操作符 不同。在將bit串右移位時,從bit串的最左邊填充原來最左邊的位。也就...

Java移位操作符以及按位操作符

按位操作符 針對兩個整數引數中的對應位執行布林代數運算,並生成乙個結果。按位與 如果兩個輸入位都是1則生成乙個輸出位1,否則生成乙個輸出位0。按位或 如果兩個輸入位只要有一位是1則生成乙個輸出位1.否則生成乙個輸出位為0。按位異或 如果兩個輸入位只有其中一位是1那麼生成輸出位1,否則生成乙個輸出位為...