如何找出启用的位数:位处理

use*_*000 -3 c

在我给出的一次采访中提到了这一点.我无法正确回答这个问题.

我想知道根据数字启用了多少位.

假设,如果数字是2,我应该返回3.如果数字是3,我应该返回7

8 4 2 1 

    1 1 

8 4 2 1

  1 1 1
Run Code Online (Sandbox Code Playgroud)

这有什么简单的方法吗?

das*_*ght 5

是的,有:从2的相应幂减去1,如下所示:

int allBitsSet = (1U << n) - 1;
Run Code Online (Sandbox Code Playgroud)

该表达式(1U << n) - 1计算2权力的值,该值n始终具有二进制形式:

1000...00
Run Code Online (Sandbox Code Playgroud)

即一个n零后跟零.当你1从那个形式的数量中减去时,你从设置1为零的位"借用" ,并将剩余的位翻转到1.

您可以通过解决十进制系统中的类似问题来形象化这一点:"创建一个有n九个数字的数字".解决方案是相同的,除了现在你需要使用10而不是2.