二进制-位运算

之前对位运算了解较少,本科期间学习的二进制等内容也基本上遗忘的差不多了,今天在做这个题的时候用位运算会时间复杂度会有不错的表现,剑指 Offer 15. 二进制中1的个数,在本文中稍微记录一下,以便以后用到相关的内容重新搜索查看这部分。

1 二进制运算

JavaScript内部默认将二进制、十六进制、八进制数值,自动转为十进制进行运算,JavaScript 提供了原生函数,进行十进制与其他各进制之间的相互转换。从其他进制转换成十进制,有三种方式:parseInt(),Number(),+(一元运算符)。这三种方式都只能转换整数。从十进制转换成其他进制,可以使用 Number.prototype.toString(),支持小数。

自己手算二进制转十进制的话,正整数方法为,对应位的值为1的话,2的对应位数的次幂相加的和(位数从0开始),对应位的值为0的话+0;

小数的转换方法为:例如16.125
十进制转换为二进制,整数位与小数位分开转换,16转为10000
0.125采用新的转换二进制方法,如下:将小数位不断乘2,每次取其整数部位数的0或1,直到小数位变成0
0.125 * 2 =0.25 ———> 0
0.250 * 2 =0.50 ———> 0
0.500 * 2 =1.00 ———> 1
得出0.125二进制表示为001,因此16.125二进制表示为10000.001;

计算机中,负数以其正值的补码形式表示,补码为该数的反码加一。关于负数的转换和浮点数的存储(分为单精度浮点数和双精度浮点数)详细情况可以参见这里=>负数和小数点在计算机中的二进制表示js浮点数精度问题以后有时间可以重新详细自己整理一篇出来

2 位运算

查看MDN中的位运算操作,主要包括按位与运算符 (&) 在两个操作数对应的二进位都为 1 时,该位的结果值才为 1,否则为 0;

位非运算符(~),反转操作数的位;

按位或运算符(|)对应位存在1及操作后对应位就变为1;

按位异或 (^)等;更详细的介绍可以去链接里的MDN文档。

左移操作符 (<<) 将第一个操作数向左移动指定位数,左边超出的位数将会被清除,右边将会补零。

下图采用MDN总结的位运算符
总结的位运算符

3 剑指 Offer 15. 二进制中1的个数题解

了解了上面的位运算之后就会发现这是一个很简单的问题了,代码如下

var hammingWeight = function (n) {
let num = 0;
for (let i = 0; i < 32; i++) {
if (n & (1 << i)) { // &按位与当二进制的相应位对应的两个数都是1时候才返回1, <<把左边的值相左移动i位
num++;
}
}
return num
};
文章作者: 鐔雨
文章链接: https://caichunyu.github.io/2022/08/07/二进制-位运算/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 鐔雨的Blog