题
我正在尝试用汇编语言编写一个函数(但假设该问题与语言无关)。
如何使用按位运算符将传入数字的所有位设置为 1?
我知道我可以将按位“或”与掩码和我希望设置的位一起使用,但我不知道如何基于一些 N 大小的二进制数构造掩码。
解决方案
〜(x <!> amp; 0)
x <!> amp; 0将始终为0,并且〜将所有位翻转为1。
其他提示
将其设置为0,然后使用按位NOT将所有位翻转为1。
你会发现用汇编语言你 有 了解“传递的数字”的大小。在汇编语言中这真的很重要 哪台机器 汇编语言是为了。
鉴于这些信息,您可能会问
- 如何将整数寄存器设置为全 1 位?
或者
- 如何用全 1 位填充内存中的某个区域?
为了用全 1 位填充寄存器,在大多数机器上,有效的方法需要两条指令:
使用专用清除指令清除寄存器,或加载立即数 0,或将寄存器与其自身进行异或。
取寄存器的按位补码。
用 1 位填充内存则需要 1 个或多个存储指令...
在汉克·沃伦(Hank Warren)的精彩书中,您会发现更多琐碎的提示和技巧 黑客的喜悦.
将x设为1
x <!> lt;数 x = x * 2
答案=数字或x - 1。
代码假定您的输入名为<!> quot; number <!> quot;。它应该适用于正值。注意负值是两次补充操作尝试没有意义,因为高位总是一个。
将其设为-1
。这通常由所有位为1表示。
使用T(~T(0))
。
其中T
是typename(如果我们谈论的是C ++。)
如果类型小于int
,这可以防止不需要的促销<=>。
不隶属于 StackOverflow