剑指offer 15 二进制中1的个数

二进制中1的个数

知识点

1、java位运算

符号介绍
>>右移运算符,符号左侧数值 按位右移 符号右侧数值指定的位数,若为正数则高位补0,若为负数则高位补1
<<左移运算符,符号左侧数值 按位左移 符号右侧数值指定的位数,并在低位处补0
>>>无符号右移运算符,符号左侧数值 按位右移 符号右侧数值指定的位数,无论正负高位补0
&与(AND)运算符,对两个整型操作数中对应位执行布尔代数,两个位都为1时输出1,否则0
|或(OR)运算符,对两个整型操作数中对应位执行布尔代数,两个位中只要有一个为1就输出1,否则为0
^异或(XOR)运算符,对两个整型操作数中对应位执行布尔代数,两个位相等则为0,不相等则为1
~非(NOT)运算符,按位取反运算符翻转操作数的每一位,即0变成1,1变成0

2、java十进制转二进制

  1. 使用位运算
public static void binaryToDecimal(int n){
        for(int i = 31;i >= 0; i--)
            System.out.print(n >>> i & 1);

    }

java的基本数据类型是固定的,int类型4个字节,32位,最高位是符号位,使用>>>

  1. 转成字符串
String result = Integer.toBinaryString(n);
System.out.println(result);

代码实现

java其实提供了直接解决这道题的API

但是感觉这种抖机灵的方法不可取,可以看一下底层源码
内置函数Integer.bitCount()
源码如下:

@HotSpotIntrinsicCandidate
    public static int bitCount(int i) {
        // HD, Figure 5-2
        i = i - ((i >>> 1) & 0x55555555);
        i = (i & 0x33333333) + ((i >>> 2) & 0x33333333);
        i = (i + (i >>> 4)) & 0x0f0f0f0f;
        i = i + (i >>> 8);
        i = i + (i >>> 16);
        return i & 0x3f;
    }

我的解法

public static int hammingWeight(int n) {
        int res=0;
        for(int i = 31;i >= 0; i--){
            if ((n>>>i&1)==1)
                res++;
//            System.out.print(n >>> i & 1);
        }
//        System.out.println();
        return res;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值