與運算
- " >>>" 無符號右移 ">>" 有符號右移
- 區(qū)別:無符號右移會給最高位補上0,而有符號右移則看原來最高位是啥,就補上啥。
- 右移一位相當于除以21,右移兩位相當于除以22
- 一個數(shù)字 & 1,則取這個數(shù)的二進制最后一位。& 15 ,則取這個數(shù)字二進制的最后4位
問題:
- 請實現(xiàn)一個函數(shù),輸入一個整數(shù),輸出該數(shù)二進制表示中1的個數(shù)。例如把9表示成二進制是1001,有2位是1。因此如果輸入9,該函數(shù)輸出2。
高效運算.PNG
/**
* 取一個數(shù)字二進制的最后一位,則&1;如果要取4位,則&15;即(2的N次-1)
* 例如把9表示成二進制是1001 ,有2位是1. 因此如果輸入9,該出2。
* >>>代表無符號右移,最高位補為0。>>有符號的右移,最高位補上原來的最高位
*
* @author xhq
*
*/
public class N10 {
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println(function1(9));
System.out.println(function2(9));
}
public static int function1(int n) {
// int型,在java中占32個字節(jié),運行32次。這樣包括負數(shù)。
// 每次運算,將末尾的一個數(shù)字移除
int result = 0;
for (int i = 0; i < 32; i++) {
if ((n & 1) == 1)
result++;
n = n >>> 1;
}
return result;
}
public static int function2(int n) {
//把一個整數(shù)減去1,再和原整數(shù)做與運算,會把該整數(shù)最右邊一個1變成0。
//那么一個整數(shù)的二進制表示中有多少個1,就可以進行多少次這樣的操作
int result = 0;
while (n > 0) {
result++;
n = n & (n - 1);
}
return result;
}
}