如何在7位二进制数上添加偶校验位

我继续上一个问题。 我正在制作ac#程序,用户输入一个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); 

复制他们用来做这个的电路可能会更有趣。

 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; 

该电路是双function返回0和1或1和0,一次也超过1位,但这对于TPL来说有点轻松….

PS你可能想检查<128的输入,否则事情会出错。

ooh没有注意到家庭作业标签,除非你能解释,否则不要使用它。

使用BitArray在这里买不到什么,如果有什么事情让你的代码更难理解。 使用&|进行基本位操作可以解决您的问题 和<<运营商。

例如,要找出某个数字中是否设置了一个数字,你可以和相应功率为2的数字。这会导致:

 int bitsSet = 0; for(int i=0;i<7;i++) if ((number & (1 << i)) > 0) bitsSet++; 

现在唯一剩下的就是确定bitsSet是偶数还是奇数,然后在必要时设置剩余的位。

几乎相同的过程,在更大的位数上只会快得多。 仅使用算术运算符(SHR && 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); }