我有一个关于在无符号整数内移动位的问题。我有两个无符号整数,比如说var1
and var2
。我需要取最左边的var1
位var2
并将它们移动到最右边的位置。所以 if var1
is12
和var2
is0x13ac8d08
那将导致var2
成为0xc8d0813a
。谁能帮助我如何在 C# 中做到这一点?
谢谢
迈克尔
我有一个关于在无符号整数内移动位的问题。我有两个无符号整数,比如说var1
and var2
。我需要取最左边的var1
位var2
并将它们移动到最右边的位置。所以 if var1
is12
和var2
is0x13ac8d08
那将导致var2
成为0xc8d0813a
。谁能帮助我如何在 C# 中做到这一点?
谢谢
迈克尔
试试这个:
var2 = (var2 << var1) | (var2 >> (32 - var1));
方法形式:
uint CyclicShiftLeft(uint input,int countBits)
{
return (input << countBits) | (input >> (32 - countBits))
}
编辑
请参阅注释以了解32
上述代码中的意义。
首先,我不明白你的问题中 var1 的功能。我也没有指定要移位或更正确地旋转的位数。在示例中,我假设您要将 12 个最高有效位移动到最低有效位置。(这就是 var1 的用途吗?)
unsigned int var2 = 0x13ac8d08;
unsigned int temp = (var2 >> 20) & 0xfff; // store and mask 12 bits in least significant position
var2 <<= 12; // shift left
var2 &= 0xfffff00; // mask to make sure no bits dragged from lsb by shift
var2 |= temp;
掩蔽可能不是绝对必要的,但确保它永远不会受到伤害。机器语言中的移位命令有时可能会扩展最高或最低有效位,而您不希望这样。