我是Bitwise操作概念的新手,今天正在搞乱一些例子。一切似乎都很清楚,直到我试图在uint
上执行循环位移的功能:
private function rotateLeft(value : uint, shift : int) : uint {
if ((shift &= 31) == 0)
return value;
return (value << shift) | (value >> (32 - shift));
}
任何想法为什么这不起作用?这看起来很简单,但我认为我遗漏了一些明显的东西。
编辑:
我愚蠢地试图移动一个颜色值(例如0xFF0000)并期望沿着0x0000FF的行,当实际上我得到0xFF000000(这是正确的,由于uint
的长度) - 最重要的字节是alpha值。
答案 0 :(得分:2)
1 - 始终保持您的班次在范围内=&gt; shift &= 31
2 - 使用无符号右移(>>>
),否则您将拥有将传播到您的号码中的位符号,因此例如(0x80000000 >> 16)
将0xffff8000
而不是0x00008000
{1}}。
function rotateLeft(value : uint, shift : int) : uint {
shift &= 31;
return (value << shift) | (value >>> (32 - shift));
}