1

可能重复:
如何在 7 位二进制数上添加偶校验位

这是我的新代码,它将 7 位二进制数转换为具有偶校验的 8 位。但是它不起作用。例如,当我输入 0101010 时,它说偶数奇偶校验的数字是 147。你能帮我看看有什么问题吗?

using System;
using System.Collections.Generic;
using System.Collections;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{


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 };
        System.Collections.BitArray bits = new System.Collections.BitArray(numberAsByte);
        a = a << 1;

        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 number with an even parity bit is:");
        Console.Write(a);
        Console.ReadLine();
    }

}

}

4

3 回答 3

6

对从 Console.ReadLine() 获得的内容使用 int.TryParse()。然后您需要检查该数字是否在 0 到 127 之间,以确保它仅使用 7 位。然后,您需要计算数字的二进制表示中 1 的数量。并将数字加 128 以设置奇偶校验位,具体取决于您指定奇校验还是偶校验。

数 1 是你真正的家庭作业。

于 2012-02-05T19:36:42.643 回答
3

通过使用BitArray该类,您可以编写

int a = Convert.ToInt32(Console.ReadLine());
byte[] numberAsByte = new byte[] { (byte)a };
BitArray bits = new BitArray(numberAsByte);

这会将字节的单个位转换为 a BitArray,它表示可以以简单方式处理的布尔数组。请注意,构造函数BitArray接受一个字节数组。由于我们只有一个字节,我们必须向它传递一个长度为 1 的字节数组,其中包含这个单字节 ( numberAsByte)。

现在让我们计算设置的位。

int count = 0;
for (int i = 0; i < 8; i++) {
    if (bits[i]) {
        count++;
    }
}

请注意,我们只需用 测试一点bits[i],它会产生一个布尔值。完全合法和正确的测试bits[i] == true会产生相同的结果,但不必要地复杂。该if语句不需要比较。它只需要一个布尔值。

这计算奇校验位。

if (count % 2 == 1) { // Odd number of bits
    bits[7] = true; // Set the left most bit as parity bit for even parity.
}

%运算符是模运算符。它产生整数除法的其余部分。如果是偶数,则x % 2产生。如果你想要一个奇校验位,你可以改为测试。0xcount % 2 == 0

BitArray有一个CopyTo方法可以将我们的位转换回一个字节数组(在我们的例子中只包含一个字节)。

bits.CopyTo(numberAsByte, 0);
a = numberAsByte[0];

numberAsByte[0]包含我们的带有奇偶校验位的数字。


如果您想要右侧的奇偶校验位,那么您必须先将数字向左移动一位。

int a = Convert.ToInt32(Console.ReadLine());
a = a << 1;

// Do the parity bit calculation as above and, if necessary
// set the right most bit as parity bit.
bits[0] = true;
于 2012-02-05T19:42:34.373 回答
0

根据维基百科,奇偶校验位有两种变体,所以我实现了参数来选择你需要的那个。它支持高达 63 位的用户输入,我将验证代码的实现留给您。

ulong GetNumberParity(string input, bool isEvenParity)
{
    ulong tmp = Convert.ToUInt64(input, 2);
    ulong c = 0;
    for (int i = 0; i < 64; i++) c += tmp >> i & 1;
    if(isEvenParity)
        return Convert.ToUInt64((c % 2 != 0 ? "1" : "0") + input, 2);
    else
        return Convert.ToUInt64((c % 2 == 0? "1" : "0") + input, 2);
}
于 2012-02-05T19:34:13.250 回答