之前对位运算了解较少,本科期间学习的二进制等内容也基本上遗忘的差不多了,今天在做这个题的时候用位运算会时间复杂度会有不错的表现,剑指 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) { |