public class Test1 { /* * 求一个数二进制中包含多少个1 例如 2二进制是10 包含一个1 * * 1.<<:左移 左边最高位丢弃,右边补齐0 2.>>:右移 最高位是0,左边补齐0;最高为是1,左边补齐1 3.>>>:无符号右移 无论最高位是0还是1,左边补齐0 * */ public static void main(String[] args) { name2(); } public static void name1() { //方法二把原数右移移一位 具体想想怎么与的 // 0000 0000 0000 0000 0000 0000 0000 1010 // 0000 0000 0000 0000 0000 0000 0000 0001 int a=-2; int count=0; for (int i = 0; i < 32; i++) { if (((a>>>i)&1)==1) { ++count; } } System.out.println(count); } public static void name() { // 方法一把1左移一位(左移后面补0)& 原数 == 1 左移一位的话就存在1 ; // 0000 0000 0000 0000 0000 0000 0000 1010 // 0000 0000 0000 0000 0000 0000 0000 0001 int a=10; int count=0; for (int i = 0; i < 32; i++) { if ((a&(1<<i))==(1<<i)) { ++count; } } System.out.println(count); } public static void name2() { /* * * 这个思路是 例如10 二进制 1010 * 如果一个数a=(a-1)& a 一直循环去肯定得到的是0 反正真的不好想到这种憨批的方法 ( (a-1)& a 消除最低位1因为 * 0111 和1000 相差1 ) * * 1010 * -0001 * ------- * 1001 * & 1010 * ---------- * 1000 * - 0001 * --------- * 0111 * 1000 * &----------- * 0 * * */ int a=10; int count=0; while (a!=0) { a=(a-1)&a; count++; } System.out.println(count); } }
判断一个整数是不是2的整数次方(如果换成2进制 就是判断二进制位上的数只包含一个1)
这个最简单的方法 是 (a-1)&a 这个是消除最低位1 假如二进制位只有一个1 那么消除后就成0了 因此 (a-1)&a==0
public class Test2 { /* * 判断一个整数是不是2的整数次方(如果换成2进制 就是判断二进制位上的数只包含一个1) * * * * */ public static void main(String[] args) { //或者可以用位运算 判断有几个1 有1个一的话为2的次方 int a=1; if (((a-1)&a)==0) { System.out.println("是2的整数次方"); }else { System.out.println("NO"); } } }