1的个数
题目描述:输入一个整数,输出该二进制表示中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的整数倍
题目描述:判断一个数是不是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); //奇偶相连
}