题目描述:输入一个整数,输出该二进制表示中1的个数
public static void main(String[] args) { int n=9; oneCount(n); } public static void oneCount(int n){ int count=0; int count1=0; int count2=0; //将1向左挪,一次与二进制数的每一位进行%运算比较 for(int i=0;i<32;i++){ if((n&(1<<i))==(1<<i)){ count++; } } //将二进制数的每一位想又挪,与1进行%运算比较 for(int i=0;i<32;i++){ if(((n>>i)&1)==1){ count1++; } } //将自己减1然后再与自己相于,直到自己为0 操作的次数就是1的个数 while(n!=0){ n=(n-1)&n; count2++; } System.out.println(count2); System.out.println(count1); System.out.println(count); } //第1种解法:将1左移;第2种解法,将二进制数右移,其实原理都是一样的 //示例 1 0 0 1 0 1 0 0 1 0 1 0 0 1 0 1 0 0 1 0 1 0 0 1 0 // 1 1 1 1 1 // 1 1 //count=2 count1=2 //第三种解法 // 1 0 0 1 0 // - 1 // = 1 0 0 0 1 // & 1 0 0 1 0 第一次与 消去第一个1 // = 1 0 0 0 0 // - 1 // = 0 1 1 1 1 // & 1 0 0 0 0 第二次与 消去第二个1 // = 0 0 0 0 0 //上述一共与运算了2次 所以count2是2 //每一次与操作 都相当于是将左边消去一个1,与操作了多少次,就相当于有多少个1题目描述:判断一个数是不是2的整数倍
public static void main(String[] args) { int n=8; if(((n-1)&n)==0){ System.out.println(n+"是2的整数倍"); } } //解析:每一个符合条件的数,他的二进制中都只有一个1,其余位全是0, // 所以只需要判断某个数的二进制的1的个数是否为1 即只需要做一次(n-1)&n的操作,结果是0,则满足要求题目描述:将一个数的二进制数的奇偶位的数据互换
public static void main(String[] args) { int x1=change(6); int x2=change(9); System.out.println(x1+" "+x2); } public static int change(int n){ int ou=n&0xaaaaaaaa; //1010 1010 ...做与运算取出偶数位 从右往左运算 偶数位和1做&运算全部取出,奇数位和0做&运算,全部为0 int ji=n&0x55555555; //0101 0101 ... 做与运算取出奇数位 从右往左运算 奇数位和1做&运算全部取出,偶数位和0做&运算,全部为0 return (ou>>1)^(ji<<1); //奇偶相连 }