相关疑难解决方法(0)

如何计算32位整数中的设置位数?

代表数字7的8位看起来像这样:

00000111
Run Code Online (Sandbox Code Playgroud)

设置三位.

什么算法来确定32位整数中的设置位数?

algorithm binary bit-manipulation hammingweight iec10967

838
推荐指数
31
解决办法
52万
查看次数

请解释Kernighan的位计数算法背后的逻辑

在以整数时间复杂度读取Bits计数算法(Brian Kernighan)之后,直接遵循此问题.有问题的Java代码是

int count_set_bits(int n) {
  int count = 0;
    while(n != 0) {
      n &= (n-1);
      count++;
    }
 }
Run Code Online (Sandbox Code Playgroud)

我想了解n &= (n-1)这里取得了什么成果?我在另一个漂亮的算法中看到了类似的构造,用于检测数字是否是2的幂,如:

if(n & (n-1) == 0) {
    System.out.println("The number is a power of 2");
}
Run Code Online (Sandbox Code Playgroud)

java algorithm bit-manipulation bit

19
推荐指数
1
解决办法
4785
查看次数

最快的方法来计算寄存器中的1个数,ARM组件

关于位操作,我之前有一个面试问题.该公司是一家知名的GPU公司.我在汇编语言方面的背景很少(尽管是计算机架构的博士生,但很奇怪),正如这个叙述所表明的那样,我把它搞砸了.问题很简单:

"编写一个快速代码,用于计算32位寄存器中1的数量."

现在我正在研究手臂组装.所以我很自然地再次重新讨论这个问题,并通过研究ISA来提出这个代码.

对于你那里的专家来说,这是对的吗?有更快的方法吗?作为初学者,我自然认为这是不完整的."xx"中的AND指令感觉多余,但没有其他方法可以在ARM中移位寄存器...

R1将包含末尾的位数,而R2是包含我们想要计数的位的寄存器.r6只是一个虚拟寄存器.评论附在()中

    MOV   R1, #0                (initialize R1 and R6 to zero)
    MOV   R6, #0        
xx: AND   R6, R6, R2, LSR #1    (Right shift by 1, right most bit is in carry flag)
    ADDCS R1, #1                (Add #1 to R1 if carry  flag is set)
    CMP R2, #0                  (update the status flags if R2 == 0 or not)
    BEQ xx                      (branch back to xx until R2==0)
Run Code Online (Sandbox Code Playgroud)

assembly arm

15
推荐指数
4
解决办法
3万
查看次数