剑指Offer11 - 二进制中1的个数
2020-06-02 06:17
148 查看
题目描述
输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。
解题思路
根据题意我们只需要将 n 与 1 进行相与运算,看结果是不是 0,然后再将 n 右移,再循环上述步骤直到 n=0 为止。看起来是这样,但是这样做存在一定的问题。因为题目中明确说出 n 可能为负数,如果将负数右移,那么高位会被符号 1 填充,这就导致结果不正确。不过在 Java 中,可以使用“>>>”进行无符号右移。
不过还有一个简便的方式就是把整数减去 1,再与原整数做与运算,会把该整数最后边一个 1 变成 0。这样满足要求的原因是与运算特质是 1 & 1 = 1; 其他情况都为 0。
代码实现
import java.util.Scanner; public class Problem11 { public static int NumberOf1(int n) { int ans = 0; while(n != 0) { n &= (n - 1); ans ++; } return ans; } public static int NumberOf2(int n) { int cnt = 0; while(n!=0){ if((n&1)!=0) cnt++; n=n>>>1; //java没有unsigned关键字,>>>就是java中的无符号右移 } return cnt; } public static void main(String[] args) { Scanner cin = new Scanner(System.in); int n = cin.nextInt(); System.out.println(NumberOf1(n)); } }
相关文章推荐
- 剑指Offer11:二进制中1的个数
- 剑指offer11 二进制中1的个数
- 如何将二进制转换为八进制、十进制、十六进制
- 51Nod 1596 搬货物 二进制
- javascript中转为二进制
- C++中的二进制、八进制、十六进制表达
- 二进制如何转十进制,十进制如何转二进制
- 项目案例:二进制文件与十六进制字符串转化常用操作
- 常用算法(C#): 十进制数转换为二进制,八进制,十六进制数的算法
- SQL语句中如何把文件以二进制数组形式存入数据库
- 十进制转化为二进制230
- VMware9二进制译码与此平台上的长模式不兼容
- 移动开发数据库二进制字段编辑工具
- poj1014||hdu1059-多重背包(基于01背包)+二进制优化
- 230转化成二进制
- 翻转二进制
- 二进制数据形式保存和获取图片
- CodingTrip - 携程编程大赛 (预赛第一场)旋转的二进制
- 十进制转化为二进制
- (Java)十进制转化为二进制