[英]C# Reverse a Bit Shifting
有没有一种方法可以反转以下位移,从而可以提取6972307/1/2/3的值? 如果没有,我只真正需要(1 << 17)值。
long shifted = (6972307 << 22) | (1 << 17) | (2 << 12) | 3;
其他背景。
偏移17的值的最大值为6,偏移12的值的最大值为31。
您可以结合使用shift和ANDs
:
var v1 = shifted & 0xfff; //3
var v2 = (shifted >> 12) & 0x1f; //2
var v3 = (shifted >> 17) & 0x1f; //1
var v4 = (shifted >> 22);
是的,您可以通过右移结果并屏蔽掉不需要的位来实现:
long top = shifted >> 22;
long part1 = (shifted >> 17) & 7;
long part2 = (shifted >> 12) & 31;
long part3 = shifted & 3;
请注意,取决于long
所使用的位数,您可能无法获得正确的顶部结果。
尝试将您的6972307转换为长时间的前移,这样表达式将如下所示:
long shifted = ((long)6972307 << 22) | (1 << 17) | (2 << 12) | 3;
因此,您将所有位正确地存储在long变量中,而不是int变量中。 之后,您可以通过右移获得6972307的值
long shiftedBack = shifted >> 22;
但是请注意,您要向左移动的值(在您的示例中为6972307)仍然必须具有某个最大值。 超过最大22位移位将切断一些位,并且您将无法正确地向后移。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.