23

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

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

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

4

6 回答 6

67

~(x & 0)

x & 0 将始终导致 0,而 ~ 会将所有位翻转为 1。

于 2009-05-04T01:49:01.947 回答
7

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

于 2009-05-04T01:51:50.600 回答
6

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

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

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

或者

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

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

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

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

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

您会在 Hank Warren 的精彩著作Hacker's Delight中找到更多有趣的技巧和窍门。

于 2009-05-04T02:25:57.770 回答
2

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

于 2009-05-04T01:49:45.503 回答
2

将 x 设置为 1

而 x < 数字 x = x * 2

答案 = 数字或 x - 1。

该代码假定您的输入称为“数字”。它应该适用于正值。请注意,对于二进制补码的负值,操作尝试毫无意义,因为高位始终为 1。

于 2009-05-04T02:11:36.620 回答
1

使用T(~T(0)).

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

int如果类型小于 ,这可以防止不需要的提升int

于 2019-04-17T20:58:37.730 回答