在 C# 中重复位的有效方法是什么?
What is an effective way of repeating bits in C#?
例如,我有一个 uint,其中一些位设置为 1:
uint x = 0b0000_0100_0010_0000
我需要将位重复 left/right N 次。像这样:
重复左,N = 1:0000_1100_0110_0000
重复左,N = 2:0001_1100_1110_0000
重复对,N = 4:0000_0111_1111_1110
所以这就像“带重复的位移位”。有没有一种有效的方法来实现这一点,最好不要循环?
您可以使用递归函数实现此目的,使用带按位或的移位运算:
static uint RepeatBits(uint input, int times, bool left)
{
if (times == 0)
{
return input;
}
else
{
return (left ? (input << times) : (input >> times)) | RepeatBits(input, times - 1, left);
}
}
用法
uint input = 0b0000_0100_0010_0000;
uint shiftLeft1 = RepeatBits(input, 1, true);
uint shiftLeft2 = RepeatBits(input, 2, true);
uint shiftRight3 = RepeatBits(input, 3, false);
输出
0000_1100_0110_0000
0001_1100_1110_0000
0000_0111_1011_1100
例如,我有一个 uint,其中一些位设置为 1:
uint x = 0b0000_0100_0010_0000
我需要将位重复 left/right N 次。像这样:
重复左,N = 1:0000_1100_0110_0000
重复左,N = 2:0001_1100_1110_0000
重复对,N = 4:0000_0111_1111_1110
所以这就像“带重复的位移位”。有没有一种有效的方法来实现这一点,最好不要循环?
您可以使用递归函数实现此目的,使用带按位或的移位运算:
static uint RepeatBits(uint input, int times, bool left)
{
if (times == 0)
{
return input;
}
else
{
return (left ? (input << times) : (input >> times)) | RepeatBits(input, times - 1, left);
}
}
用法
uint input = 0b0000_0100_0010_0000;
uint shiftLeft1 = RepeatBits(input, 1, true);
uint shiftLeft2 = RepeatBits(input, 2, true);
uint shiftRight3 = RepeatBits(input, 3, false);
输出
0000_1100_0110_0000
0001_1100_1110_0000
0000_0111_1011_1100