我正在尝试用汇编语言编写一个函数(但假设该问题与语言无关)。

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

我知道我可以将按位“或”与掩码和我希望设置的位一起使用,但我不知道如何基于一些 N 大小的二进制数构造掩码。

有帮助吗?

解决方案

〜(x <!> amp; 0)

x <!> amp; 0将始终为0,并且〜将所有位翻转为1。

其他提示

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

你会发现用汇编语言你 了解“传递的数字”的大小。在汇编语言中这真的很重要 哪台机器 汇编语言是为了。

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

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

或者

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

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

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

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

用 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,这可以防止不需要的促销<=>。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top