Java 返回二进制中1的个数 (五中解法总结)

目录

1.字符串查找法

2.按位与解法(for循环)

 3.按位与解法(while循环)

4.减一相与法 (n&(n-1))

 5.同源题--分别取二进制数奇偶位上的数


写一个函数返回参数二进制中1 的个数
eg: 15    00001111    有4个1

说人话就是:↓↓↓↓↓↓↓↓↓

有几个1啊!

好了不皮了,说正事儿

1.字符串查找法

是自己第一时间的思路,通过方法转换成二进制字符串,在通过索引找出1的次数 

  public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int num = sc.nextInt();
        System.out.println(numberOneCount(num));
    }
    public static int numberOneCount(int num) {
        String binaryString = Integer.toBinaryString(num);//用包装类调用方法转换成二进制字符串
          int count = 0;
        for (int i = 0; i <binaryString.length() ; i++) {
            char c = binaryString.charAt(i);  //char c 存储字符串的索引字符
            if(c=='1'){
                count++;   //当索引到字符1时,计数+1;
            }
        }
        return  count ;
    }
}

2.按位与解法(for循环)

通过位运算和逻辑运算

进一步简洁的同时,达到了目的

只要个位数是1,与1相与就不等于0

无符号右移,在左边补零,右边的个位依次和1相与

直到等于0 ,每不等于一,计数加一

    public static int numberOneCount(int num) {
        int count = 0;
        for (int i = 0; i < num; i++) {//只要个位数是1,与1相与就不等于0
            if (((num >>> i) & 1) != 0) {         //无符号右移,在左边补零,右边的个位依次和1相与
                count++;                 //直到等于0  ,每不等于一,计数加一
            }
        }
        return count;
    }

 3.按位与解法(while循环)

原理同上,只是循环形式不同

   public static int numberOneCount(int num) {//用while循环写 按位与法
        int count = 0;
        while (num != 0) {
            if ((num & 1) != 0) {
                count++;
            }
            num = num >>> 1;
        }
        return count;
    }

4.减一相与法 (n&(n-1))

因为每次减1相与 , 个位数一直不一致
每次与一个减1的数,就会与掉一个1
只要不等于0,次数加一

 public static int numberOneCount(int num) {
        int count = 0;
        while (num != 0) {
            num = num & (num - 1);     //因为每次减1相与 , 个位数一直不一致
            count++;             // 每次与一个减1的数,就会与掉一个1
        }                       //只要不等于0,次数加一
        return count;
    }

 5.同源题--分别取二进制数奇偶位上的数

  for (int i = 31; i >= 1; i -= 2) {
            System.out.print(((num >> i) & 1));   //求偶位上的数
        }
        System.out.println(" ");
        for (int i = 30; i >= 0; i -= 2) {      //奇位
            System.out.print(((num >> i) & 1));
        }

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值