我正在尝试在汇编中编写一个函数(但让我们假设该问题与语言无关)。
如何使用按位运算符将传入数字的所有位设置为 1?
我知道我可以将按位“或”与带有我希望设置的位的掩码一起使用,但我不知道如何根据一些 N 大小的二进制数构造掩码。
我正在尝试在汇编中编写一个函数(但让我们假设该问题与语言无关)。
如何使用按位运算符将传入数字的所有位设置为 1?
我知道我可以将按位“或”与带有我希望设置的位的掩码一起使用,但我不知道如何根据一些 N 大小的二进制数构造掩码。
~(x & 0)
x & 0 将始终导致 0,而 ~ 会将所有位翻转为 1。
将其设置为 0,然后使用按位非将所有位翻转为 1。
你会发现在汇编语言中你必须知道“传入数字”的大小。在汇编语言中,汇编语言用于哪台机器真的很重要。
鉴于这些信息,您可能会问
或者
为了用全 1 位填充寄存器,在大多数机器上,有效的方法需要两条指令:
使用专用清除指令清除寄存器,或加载立即数 0,或将寄存器与自身异或。
取寄存器的按位补码。
然后用 1 位填充内存需要 1 个或多个存储指令......
您会在 Hank Warren 的精彩著作Hacker's Delight中找到更多有趣的技巧和窍门。
将其设置为-1
。这通常由所有位为 1 来表示。
将 x 设置为 1
而 x < 数字 x = x * 2
答案 = 数字或 x - 1。
该代码假定您的输入称为“数字”。它应该适用于正值。请注意,对于二进制补码的负值,操作尝试毫无意义,因为高位始终为 1。
使用T(~T(0))
.
类型名在哪里T
(如果我们谈论的是 C++。)
int
如果类型小于 ,这可以防止不需要的提升int
。