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);    //奇偶相连
	}