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

本文关键字:偶校验 奇偶 二进制数 | 更新日期: 2023-09-27 18:22:28

可能重复:
如何在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();
    }
}

}

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

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

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

使用BitArray类可以编写

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

这将字节的单个位转换为BitArray,CCD_2表示可以以简单的方式处理的布尔值数组。请注意,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.
}

%运算符是模运算符。它产生整数除法的剩余部分。如果CCD_ 11是偶数,则CCD_。如果您想要一个奇数奇偶校验位,您可以测试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;

根据维基百科,奇偶校验位有两种变体,所以我实现了参数来选择您需要的。它支持高达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);
}