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

Posted

技术标签:

【中文标题】如何在未知大小的二进制数中将所有位设置为“1”?【英文标题】:How can I set all bits to '1' in a binary number of an unknown size? 【发布时间】:2009-05-04 01:46:17 【问题描述】:

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

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

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

【问题讨论】:

将数字的值设置为“-1”是否如我所愿? “未知尺寸”是什么意思?您的函数是否接收到指向某个 bigint 位置的地址? 取决于机器架构。查看 -1 是如何表示的。 -1 因为上述两个 cmets 中都有“-1”。 ... 开玩笑。 -1 强制转换为无符号类型始终是 all-bits-set-to-1。 【参考方案1】:

~(x & 0)

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

【讨论】:

为什么还需要 x? ~0 归结为,您的描述甚至暗示了它(“将始终导致 0,...”)。 @Pax:也许是因为常量 0 可以是任何数字类型。包含 x 会给出一个上下文(因此是一个大小,或更重要的是位数),具体取决于编译器。 如果给定类型T(例如使用模板参数时),则可以写为~T(0)【参考方案2】:

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

【讨论】:

【参考方案3】:

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

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

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

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

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

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

    取寄存器的按位补码。

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

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

【讨论】:

【参考方案4】:

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

【讨论】:

在我见过的大多数实现中,signed 整数都是如此,但为了安全起见,我可能会使用例如 Sean 的按位 NOT 方法。 当你关心内部二进制表示时,你也不应该使用有符号类型。 也适用于未签名的 C/C++。见***.com/a/66269639/4989451【参考方案5】:

将 x 设置为 1

当 x

答案 = 数字或 x - 1。

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

【讨论】:

【参考方案6】:

使用T(~T(0))

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

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

【讨论】:

以上是关于如何在未知大小的二进制数中将所有位设置为“1”?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Python 中将浮点数列表输出到二进制文件

如何将二进制数拆分为 6 位二进制数并在 C 中添加其他位?

如何在 Python 中将负指数数转换为十进制数?

在c ++中将负整数转换为二进制字符串

原码反码补码

如何在 Redshift 中将十六进制数转换为二进制数?