我将继续上一个问题。我正在制作一个c#程序,用户输入一个7位二进制数,计算机打印出数字右侧偶数奇偶校验位的数字。我在挣扎。我有一个代码,但它说BitArray是一个命名空间,但用作一个类型。另外,有没有一种方法可以改进代码并使其更简单?
namespace BitArray
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Please enter a 7-bit binary number:");
int a = Convert.ToInt32(Console.ReadLine());
byte[] numberAsByte = new byte[] { (byte)a };
BitArray bits = new BitArray(numberAsByte);
int count = 0;
for (int i = 0; i < 8; i++)
{
if (bits[i])
{
count++;
}
}
if (count % 2 == 1)
{
bits[7] = true;
}
bits.CopyTo(numberAsByte, 0);
a = numberAsByte[0];
Console.WriteLine("The binary number with a parity bit is:");
Console.WriteLine(a);
答案 0 :(得分:2)
复制他们用来做这个的电路可能会更有趣..
bool odd = false;
for(int i=6;i>=0;i--)
odd ^= (number & (1 << i)) > 0;
然后,如果你想要奇偶校验将第7位设置为奇数,奇数奇偶校验设置为非奇数。
或
bool even = true;
for(int i=6;i>=0;i--)
even ^= (number & (1 << i)) > 0;
电路是双功能返回0和1或1和0,一次也超过1位,但这对于TPL来说有点轻松....
PS你可能想检查&lt;的输入128否则事情就会出错。
ooh没有注意到家庭作业标签,除非你能解释,否则不要使用它。
答案 1 :(得分:1)
几乎相同的过程,在更大的位数上只会快得多。仅使用算术运算符(SHR&amp;&amp; XOR),不带循环:
public static bool is_parity(int data)
{
//data ^= data >> 32; // if arg >= 64-bit (notice argument length)
//data ^= data >> 16; // if arg >= 32-bit
//data ^= data >> 8; // if arg >= 16-bit
data ^= data >> 4;
data ^= data >> 2;
data ^= data >> 1;
return (data & 1) !=0;
}
public static byte fix_parity(byte data)
{
if (is_parity(data)) return data;
return (byte)(data ^ 128);
}
答案 2 :(得分:0)
使用BitArray
并不会给您带来太多帮助,如果有任何问题,您的代码会更难理解。使用&
和|
以及<<
运算符进行基本位操作可以解决您的问题。
例如,要查明某个位是否设置了一个数字,你可以&amp;相应功率为2的数字。这导致:
int bitsSet = 0;
for(int i=0;i<7;i++)
if ((number & (1 << i)) > 0)
bitsSet++;
现在唯一剩下的就是确定bitsSet
是偶数还是奇数,然后在必要时设置剩余比特。