数据结构与算法(位运算) --javascript言语形貌

二进制中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));
    原文作者:小柚子
    原文地址: https://segmentfault.com/a/1190000013293879
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞