繁体   English   中英

C#反转位移

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM