如何在未知大小的二进制数中将所有位设置为“1”?

时间:2009-05-04 01:46:18

标签: bit-manipulation

我正在尝试在程序集中编写一个函数(但我们假设语言与该问题无关)。

如何使用按位运算符将传入的数字的所有位设置为1?

我知道我可以使用带有我希望设置的位的掩码的“或”,但我不知道如何根据N大小的二进制数构造掩码。

6 个答案:

答案 0 :(得分:55)

〜(x& 0)

x& 0将始终为0,并且〜将所有位翻转为1。

答案 1 :(得分:7)

将其设置为0,然后使用按位NOT将所有位翻转为1。

答案 2 :(得分:6)

你会发现用汇编语言你知道来知道“传入号码”的大小。在汇编语言中,汇编语言适用于哪种机器非常重要。

鉴于这些信息,您可能会问

  • 如何将整数寄存器设置为全1位?

  • 如何用1位填充内存区域?

要填充所有1位的寄存器,在大多数机器上,有效的方法需要两条指令:

  1. 使用专用的清除指令清除寄存器,或者立即加载0,或者将寄存器与自身挂起。

  2. 取寄存器的按位补码。

  3. 使用1位填充内存则需要1个或更多存储指令...

    你会在Hank Warren的精彩书Hacker's Delight中找到更多有点蠢蠢欲动的提示和技巧。

答案 3 :(得分:1)

将x设为1

x<数   x = x * 2

答案=数字或x - 1。

代码假定您的输入被称为“数字”。它应该适用于正值。注意负值是两次补充操作尝试没有意义,因为高位总是一个。

答案 4 :(得分:0)

将其设为-1。这通常由所有位为1表示。

答案 5 :(得分:0)

使用T(~T(0))

T是类型名(如果我们在谈论C ++。)

如果类型小于int,则可以防止意外升级到int