【发布时间】:2016-04-28 13:52:03
【问题描述】:
好的,让我们从一个 32 位整数开始:
int big = 536855551; // 00011111111111111100001111111111
现在,我想将最后 10 位设置在这个整数内:
int little = 69; // 0001101001
所以,我的方法是这样的:
big = (big & 4294966272) & (little)
4294966272 是前 22 位,或 11111111111111111111110000000000。
当然,这不受支持,因为4294966272 超出了0x7FFFFFFF 的int 范围。此外,这不会是我唯一的操作。我还需要能够设置位 11 到 14。我的方法(有同样的问题)是:
big = (big & 4294951935) | (little << 10)
因此,在解释完之后,我正在做的就是替代上述内容:
1: ((big >> 10) << 10) | (little)
2: (big & 1023) | ((big >> 14) << 14) | (little << 10)
我不觉得我的替代方案是我可以采用的最好、最有效的方法。有没有更好的方法来做到这一点?
旁注:如果 C# 支持二进制字面量,'0b',这会更漂亮。
谢谢。
【问题讨论】:
-
使用 BigInteger .....?
-
-
旁注:对于公共源代码,请使用十六进制表示法或显式位移 (10xFFFFFC00 时,我不知道有谁能够将 4294966272 转换为他们头中的位。
-
@AlexeiLevenkov 我发现二进制文件更容易阅读。尤其是当我的重点是设置特定位时。所以不,当我的主要关注点是位时,我不会使用十六进制表示。
标签: c# int bit-manipulation 32-bit uint32