二进制中1的个数
请完成一个函数,输入一个整数,输出该数二进制示意1的个数。比方把9示意成二进制是1001,有2位是1。因此假如输入9,该函数输出2。
起首关于二进制1的求解,在这里,我们最应当想到的就是关于位运算的一些操纵符。总共有五种运算,分别是:与(&),或(|),异或(^),右移(>>),左移(<<)。
第一种能够会引起死循环的解法:
思绪1:先对你所给的这个整数举行推断,这个数的最右侧是否是1。假如是1,给一个计数器,给它加1。接着把输入的整数右移一名,如许一向举行移位,末了直到这个整数变成0为止,然后输出计数器就好了。
function NumberOf1(n)
{
let count = 0;
while(n) {
if(n & 1) {
count ++;
}
n = n >> 1;
}
return count;
}
console.log(NumberOf1(9));
这个算法关于无标记数来讲没有题目,但是关于有标记数题目就大了,极有能够构成死循环。当n为负数时,n右移在最高位补1(为了保证数据为负数),因此终究就会构成死循环。比方:0x80000000时,这时刻就会出现题目,当右移一名的时刻时,就变成了0xC0000000。由于是对负数的移位,所以必需保证移位后是个负数,所以最高位永久都会是1,所以也就意味这终究这个数字永久会死循环下去。
思绪2:挪动1,先推断最低位是否是1,然后把1移成2。再与整数比比较,就可以推断倒数第二位是否是1,顺次下去。。。如许终究就可以杀青一个结果,获得一切的1的个数。
function NumberOf1(n) {
let count = 0;
let flag = 1;
while(flag) {
if(n & flag) {
count ++;
}
flag = flag << 1;
}
return count;
}
console.log(NumberOf1(9));
末了,我们供应出来一种最好的要领。
思绪3:把一个整数减去了1,再和原整数做与运算,会把这个整数最右侧一个1变成0,而且把这个1背面的0都变成1。那末一个整数的二进制有多少个1,就可以够举行多少次如许的操纵,末了,通过把计数器肯定运算次数,输出计数器就好了。
//更好的解法
function NumberOf1(n) {
let count = 0;
while(n) {
count ++;
n = (n-1) & n;
}
return count;
}
console.log(NumberOf1(9));