有没有办法扭转以下的位移,所以我可以提取6972307 / 1/2/3的值?如果不是,我只是真正“需要”(1<<<<<<<<<<<<#17)值
long shifted = (6972307 << 22) | (1 << 17) | (2 << 12) | 3;
其他背景。
移位17的值的最大值为6,移位12的最大值为31.
答案 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位移位将切断一些位,你将无法正确地移回。