剑指Offer--二进制中1的个数--java

题目描述:
输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。

知识回顾:
 原码:将一个整数,转换成二进制,就是其原码。
如单字节的5的原码为:0000 0101;-5的原码为1000 0101。

反码:正数的反码就是其原码;负数的反码是将原码中,除符号位以外,每一位取反。
如单字节的5的反码为:0000 0101;-5的反码为1111 1010。

补码:正数的补码就是其原码;负数的反码+1就是补码。
如单字节的5的补码为:0000 0101;-5的原码为1111 1011。

在计算机中,正数是直接用原码表示的,如单字节5,在计算机中就表示为:0000 0101。
负数用补码表示,如单字节-5,在计算机中表示为1111 1011。

计算机中数据存储形式位二进制位。

正数以原码形式存储

负数以补码形式存储

int类型数据,占4个字节,一个字节8位,所以int类型占32个二进制位。

比如:9的原码位 00001001 完整形式为00000000 00000000 00000000 00001001

对于负数求二进制位,需要先求出其对应的正数的二进制位。

比如:-5对应的正数5的二进制原码为,00000101 完整形式为00000000 00000000 00000000 00000101

-5对应的正数5的二进制反码为,11111010 完整形式为 11111111 11111111 11111111 11111010

-5对应的正数5的二进制补码=反码+1, 完整形式为 11111111 11111111 11111111 11111011

解题思路:
因为题目给出的是int类型,java中的int类型用32位表示,把这个数依次无符号右移(考虑到负数所以选择无符号右移)然后与1作与运算。如果结果为1则count自增

代码如下:
public class Solution {
public int NumberOf1(int n) {
int sum=0;

for(int i=0;i<32;i++ ){
if((n>>i&1)==1){
sum++;

}
}
return sum;
}
}

运行结果:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_43689040/article/details/87609874