标签:15 Offer 二进制 res 补码 取反 int public
剑指 Offer 15. 二进制中1的个数
这道题目是求整形数字的二进制中1的个数,并且符号位也计算在内,就是把数字作为无符号的整形处理。
这题有三种以上的做法,第一种是把每一位二进制上的数字与1做&运算后的结果加起来,将n右移一位,java的无符号的右移是>>>
代码如下:
public class Solution {
// you need to treat n as an unsigned value
public int hammingWeight(int n) {
int res = 0;
while (n!=0) {
res += n&1;
n>>>=1;
}
return res;
}
}
第二种做法是n不断与(n-1)做&运算,这样就可以把n的最低一位1变为0,示例如下
n: 100100
n-1:100011
经过&运算之后,后三位就会全变为0,只要n不为0,重复之前的做法并计数即可
代码:
public class Solution {
// you need to treat n as an unsigned value
public int hammingWeight(int n) {
int res = 0;
while (n!=0) {
res++;
n&=(n-1);
}
return res;
}
}
第三种做法就是,n&(-n)可以取出n的最后一位1,例如二进制数1110010,经过运算可以得到最低位的1为10,让1110010减去10得1110000,不断把末尾1减去并计数即可得到结果
代码:
public class Solution {
// you need to treat n as an unsigned value
public int hammingWeight(int n) {
int res = 0;
while (n!=0) {
res++;
n-=n&(-n);
}
return res;
}
}
8位有符号数的范围是-128~127
规定(维基百科-补码词条):
负数的补码 = 该负数的绝对值按位取反 + 1
则补码 1000 0000 ,减一得 0111 1111,按位取反即为128,即该补码对应的值为-128
总结:
- byte 占用一个字节, 8 位,对于计算机来说表数范围为 0000 0000 ~ 1111 1111
- 最高位表示符号位
- 计算机用补码表数
- 正数和0的补码 = 源码
- 负数的补码 = 该负数的绝对值按位取反 + 1
标签:15,Offer,二进制,res,补码,取反,int,public 来源: https://www.cnblogs.com/xyqxyq/p/14409101.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。