如何在未知大小的二进制数中将所有位设置为“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”?的主要内容,如果未能解决你的问题,请参考以下文章