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

18 bit-manipulation

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

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

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

小智 57

〜(x&0)

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

  • @Pax:也许是因为常量0可以是任何数字类型.根据编译器的不同,包括x给出了一个上下文(因此是一个大小,或者更重要的是位数). (16认同)
  • WTF?为什么你甚至需要x?〜0就是归结为,你的描述甚至暗示它("将永远导致0,......"). (6认同)
  • 获得正确类型的非常好的技巧!+1. (2认同)
  • 如果给定类型“T”(例如使用模板参数时),则可以写为“~T(0)”。 (2认同)

Jer*_*ten 7

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


Nor*_*sey 6

你会发现用汇编语言你必须知道"传入的数字"的大小.在汇编语言中,汇编语言适用于哪台机器真的很重要.

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

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

要么

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

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

  1. 使用专用清除指令清除寄存器,或者立即加载0,或者将寄存器与自身进行xor清除.

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

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

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


sth*_*sth 5

将其设置为-1. 这通常用所有位都为 1 来表示。

  • 在我见过的大多数实现中,有符号整数都是如此,但为了安全起见,我可能会使用按位 NOT 方法,例如 Sean 的方法。 (4认同)