剑指offer子求一个整数二进制中1的个数

输入一个整数,输出该数32位二进制表示中1的个数。其中负数用补码表示。

class Solution {
    public int NumberOf1(int n) {
        int count = 0;
        //比较巧妙的方法,统计出现一个整数二进制数值(计算机中数值都是以补码的形式存在的,正数的补码为本身,负数的补码
        // 需要额外求出来,先求反码,然后再加一。反码是符号位不变,然后其余位取反)
        while(n!= 0){
            count++;
            //让n和n-1做按位与操作,假如有一个数二进制为1100,现在要统计这个二进制数中出现的1的个数,那么它减一之后为1011,此时做&运算可以把它
            //最右边出现的1开始后面的所有位置零,下一次循环就继续找到下一个最右边的值,如此往复,那么就可以一个统计出
            //整形二进制中1出现的个数。
            n = n & (n - 1);
        }
        return count;
    }
}

这里在补充一点关于求一个整数的二进制的一些方法

   public static int NumberOf1(int n) {
        /*
        * 第一种方法,自己想的
        * */
        
        boolean flag = false;
        if (n < 0) {
            n=-n;
        }
        int index;
        ArrayList arrayList = new ArrayList();
        StringBuilder sb = new StringBuilder();
        while (n / 2.0 != 0) {
            index = n % 2;
            n = n / 2;
            arrayList.add(index);
        }
        System.out.println(arrayList);
        Collections.reverse(arrayList);//获得了二进制的表现初级形式.
        System.out.println(arrayList);
        int len = 32 - arrayList.size();

        for (int i = 0, k = 0; i < 32; i++) {//获得32位二进制表示的字符串
            if (i < len) {
                sb.append("0");
            } else {
                sb.append(arrayList.get(k));
                k++;
            }
        }
        String str = sb.toString();
        System.out.println(str);

        if(flag){//如果该整数,就还有进行求反码,以及根据反码求补码
            sb.setCharAt(0,'1');
            for(int i=1;i<=31;i++){//除了符号位取反
                if(sb.charAt(i)=='0'){
                    sb.setCharAt(i,'1');
                }
                else{
                    sb.setCharAt(i,'0');
                }
            }
            //加一操作
            if(sb.charAt(sb.length()-1)=='0'){//如果最后一位为零,那么直接加一即可,这里是直接设置为1
                sb.setCharAt(sb.length()-1,'1');
            }
            else {//如果最后一位不为0,那么就是1,加一之后,要让它变成零,进位
                //找到倒数第一个为零的字符,然后让这个字符置为1,它后面的字符都为0
                int zeroIndex = sb.lastIndexOf("0");
                sb.setCharAt(zeroIndex,'1');
                for(int ind=zeroIndex;ind<sb.length()-1;ind++){
                    sb.setCharAt(ind,'0');
                }
            }
            str=sb.toString();
            System.out.println(str);
        }
        
        /*
        * 第二种方法
        * */
        
        for(int j=31;j>=0;j--){
            if(((1<<j)&n)!=0){
                System.out.print("1");
            }else {
                System.out.print("0");
            }
        }         
        
        /*
        * 第三种方法
        * */

        System.out.println(Integer.toBinaryString(26));
        return 1;
    }

问题虽然是暂时得到了解决关于本题,引发了我的新的疑问,就是如果说要统计0出现的次数应该怎么写?(不用系统函数的情况)欢迎广大网友给点建议?

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值