2

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

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

附加背景。

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

4

3 回答 3

2

您可以使用 shift 和 的组合ANDs

var v1 = shifted & 0xfff; //3
var v2 = (shifted >> 12) & 0x1f; //2
var v3 = (shifted >> 17) & 0x1f; //1
var v4 = (shifted >> 22);
于 2013-03-17T12:45:55.140 回答
2

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

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

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

于 2013-03-17T12:46:17.450 回答
1

尝试将您的 6972307 转换为长之前的班次,这样表达式将如下所示:

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

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

long shiftedBack = shifted >> 22;

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

于 2013-03-17T12:45:21.560 回答