来自二进制数的C#奇偶校验位

时间:2012-02-05 19:10:29

标签: c# binary parity

  

可能重复:
  How to add even parity bit on 7-bit binary number

这是我的新代码,它将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();
    }

}

}

3 个答案:

答案 0 :(得分:6)

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

计算1s是你真正的家庭作业。

答案 1 :(得分:2)

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

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

这会将字节的单个位转换为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是偶数,0会产生x。如果你想要一个奇校验位,你可以测试count % 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;

答案 2 :(得分:0)

根据wikipedia,有两种奇偶校验位,所以我实现了参数来选择你需要的那个。它支持最多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);
}