Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 位反转数乘以N位_C# - Fatal编程技术网

C# 位反转数乘以N位

C# 位反转数乘以N位,c#,C#,我试图找到一个简单的算法,将一个数的位反转到N个位。例如: 对于N=2: 01 -> 10 11 -> 11 对于N=3: 001 -> 100 011 -> 110 101 -> 101 我一直在寻找的唯一东西是如何对一个完整字节进行位反转,但这只适用于N=8,而这并不总是我所需要的 有人知道一种算法可以进行这种按位运算吗?我需要为FFT做很多这样的操作,所以我也在寻找一些可以非常优化的方法。这是位反转操作的C#实现: public uint Reverse(

我试图找到一个简单的算法,将一个数的位反转到N个位。例如:

对于N=2:

01 -> 10
11 -> 11
对于N=3:

001 -> 100
011 -> 110
101 -> 101
我一直在寻找的唯一东西是如何对一个完整字节进行位反转,但这只适用于N=8,而这并不总是我所需要的

有人知道一种算法可以进行这种按位运算吗?我需要为FFT做很多这样的操作,所以我也在寻找一些可以非常优化的方法。

这是位反转操作的C#实现:

public uint Reverse(uint a,int length)
{
uint b=0b_0;
for(int i=0;i1;
}
返回b;
}
上面的代码首先将输出值向左移位,并将输入最小位置的位添加到输出,然后将输入向右移位。并重复该操作,直到所有位都完成。以下是一些示例:

uint a=0b_1100;
uint b=反向(a,4);//应该是0b_0011;

uint a=0b_100;
uint b=反向(a,3);//应该是0b_001;
这个实现的时间复杂度是O(N),其中N是输入的长度


是否使用字符串操作在中编辑

static void Main(string[] args)
{
    uint number = 269;
    int numBits = 4;
    string strBinary = Convert.ToString(number, 2).PadLeft(32, '0');
    Console.WriteLine($"{number}");
    Console.WriteLine($"{strBinary}");


    string strBitsReversed = new string(strBinary.Substring(strBinary.Length - numBits, numBits).ToCharArray().Reverse().ToArray());
    string strBinaryModified = strBinary.Substring(0, strBinary.Length - numBits) + strBitsReversed;
    uint numberModified = Convert.ToUInt32(strBinaryModified, 2);
    Console.WriteLine($"{strBinaryModified}");
    Console.WriteLine($"{numberModified}");

    Console.Write("Press Enter to Quit.");
    Console.ReadLine();
}
输出:

269
00000000000000000000000100001101
00000000000000000000000100001011
267
Press Enter to Quit.

这里有一个小型的查找表解决方案,适用于(2)其他位是否需要保持不变或为零(或者可以设置为零而不产生影响)?如果是这样的话,它只是一个字节大小的位反转,然后是一个shirt。只有N以下的位需要反转,其余的都保证为零。因此,例如,对于N=2:
0000 0001
变成
0000 0010
希望这有助于解释它。最快、最有效的方法就是使用查找table@MickyD我会ld仍然需要一个算法来将结果存储到LUT中:),但如果一个算法占用大量时间,这是一个好主意。请参阅。转换为您选择的语言。字符串操作并不真正符合“优化”要求。当然,字符串操作“缓慢”,但我们在这里使用的是C#,这在速度方面还不太清楚(臃肿的.Net framework有人吗?)。如果没有更多关于目标系统的详细信息以及FFT实际需要的速度,我不会在没有看到一些实际规格和测试结果的情况下敲打它…@wduk。我怀疑这会和你得到的一样好。它是O(N)(其中N是位宽度)唯一的代价是每一位两次移位和一对逐位逻辑运算。循环工作的代价可能比每一位运算的代价要高。我无法想象你在任意的N中完成这项工作(顺便说一下,如果你决定做这样的事情,考虑使用@ MuhammadVakili的算法作为测试的真实来源。像这样疯狂,它可以工作。35年前,我写了一个Z80乘法例程,它是一个类似的开关驱动的移位集并添加。它不是很有趣,但是它工作得很好(而且很快)。.这是针对嵌入式设备的。我们根据标准的“乘法表”离线编写测试