计算 C 中连续的 1

标签 c bitwise-operators

<分区>

Possible Duplicate:
Finding consecutive bit string of 1 or 0

是否可以从左开始计算整数中连续的 1? So:从最高位开始连续设置位的总数。

仅使用:

! ~ & ^ | + << >>

-1= 0xFFFFFFFF 将返回 32

0xFFF0F0F0 将返回 12 (FFF = 111111111111)

不幸的是,没有循环。

可以承担的机器:

  1. 使用 2s 补码,整数的 32 位表示。

  2. 执行算术右移。

  3. 将整数移动更多时具有不可预测的行为 比字长。

我被禁止:

  1. 使用任何控制结构,如 if、do、while、for、switch 等。

  2. 定义或使用任何宏。

  3. 在此文件中定义任何附加函数。

  4. 调用任何函数。

  5. 使用任何其他操作,例如 &&、||、- 或 ?:

  6. 使用任何形式的转换。

  7. 使用 int 以外的任何数据类型。这意味着你 不能使用数组、结构或 union 。

我看过 Finding consecutive bit string of 1 or 0 它使用循环,我不能使用。我什至不知道从哪里开始。

(是的,这是一项任务,但我只是想请那些足够熟练的人帮忙。我已经完成了几乎所有我需要做的事情,但这个不行。)

(对于那些仅仅因为它是为了学校而投反对票的人: 常问问题: 1 一个具体的编程问题,检查 2 但是,如果您的动机是“我希望其他人向我解释 ______”,那么您可能没问题。)

最佳答案

你可以这样做:

int result = clz(~x);

即反转所有位,然后计算前导零。

clz 返回前导零位的数量(也通常称为 ffsnlz)- 参见此处了解实现细节:http://en.wikipedia.org/wiki/Find_first_set#Algorithms

关于计算 C 中连续的 1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12605528/

相关文章:

c++ - 使用 lldb 调试器显示指针值

c - char数组的按位运算

c++ - 这是 operator<</>> 的正确实现吗?

c - 在子菜单项上使用 EnableMenuItem

c - 对于将字符串插入链表非常困惑

C输出太长

haskell - 二进制表示的 Data.Bits 操作

c - '(unsigned)1' 和 '(unsigned)~0' 之间的区别

c++ - `(i & (i + 1)) - 1` 是什么意思? (在芬威克树中)

c - 从父级向特定子级发送信号