其他
剑指offer:二进制中1的个数
前言
本来是打算次条每天更新面试题和算法刷题的,加上头条一共要三篇文章,实在更不来,而且两篇都看的人也不多,所以我就算法刷题和面试题论着更新,更新的时候多更新几道。
题目描述
输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。
点击左下角的阅读原文即可跳到原题,可以提交代码
解答
方法1
让 n 和 000….001,相与判断第一位是不是 1 ,然后和 00….010相与判断第二位是不是 1,以此类推。代码如下:
1 public int NumberOf1(int n) {
2 int count = 0;
3 int k = 1;
4 while (k != 0) {
5 if ((n & k) != 0) {
6 count++;
7 }
8 k = k << 1;
9 }
10 return count;
11 }
方法2
这个方法就比较牛逼了,可以说是最优解,直接看代码,如果不懂的可以自己找几个数字演示下,就能够理解了。
1 public int NumberOf12(int n) {
2 int count = 0;
3 int k = 1;
4 while (n != 0) {
5 count++;
6 n = (n - 1) & n;
7 }
8 return count;
9 }
其实有很多题是可以利用位的与,或,异或来解决的,大家可以思考下平时遇到哪些题是用这种方法解决的,我后面会给出几道题,这些题都可以用异或位运算巧妙解决。发的另一道题也用到了位运算。
其实我是想跟大家说,做题的时候,有时候想想是否可以用位运算来解决。
往期
关注我 ,每天进步一点点