C#反转位移位

时间:2013-03-17 12:36:29

标签: c# .net bit-shift

有没有办法扭转以下的位移,所以我可以提取6972307 / 1/2/3的值?如果不是,我只是真正“需要”(1<<<<<<<<<<<<#17)值

long shifted = (6972307 << 22) | (1 << 17) | (2 << 12) | 3;

其他背景。

移位17的值的最大值为6,移位12的最大值为31.

3 个答案:

答案 0 :(得分:2)

您可以结合使用轮班和ANDs

var v1 = shifted & 0xfff; //3
var v2 = (shifted >> 12) & 0x1f; //2
var v3 = (shifted >> 17) & 0x1f; //1
var v4 = (shifted >> 22);

答案 1 :(得分:2)

是的,您可以通过右移结果并屏蔽掉不需要的位来实现这一目标:

long top = shifted >> 22;
long part1 = (shifted >> 17) & 7;
long part2 = (shifted >> 12) & 31;
long part3 = shifted & 3;

请注意,根据long使用的位数,您可能无法获得顶部的正确结果。

答案 2 :(得分:1)

尝试将您的6972307转换为较长的前一班次,以便表达式如下:

long shifted = ((long)6972307 << 22) | (1 << 17) | (2 << 12) | 3;

因此,您将所有位正确存储在long变量中,而不是存储在int变量中。之后,您可以通过右移

获得6972307的价值
long shiftedBack = shifted >> 22;

但是请注意,您向左移动的值(在您的示例中为6972307)仍然必须有一些最大值。超过最大22位移位将切断一些位,你将无法正确地移回。