1

我继续我之前的问题。我正在制作 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);
4

3 回答 3

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 你可能想检查输入是否 < 128 否则事情会很顺利。

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

于 2012-02-06T20:09:30.880 回答
1

几乎相同的过程,只是在更多的位上更快。仅使用算术运算符 (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);
}
于 2013-05-24T09:44:00.973 回答
0

在这里使用 aBitArray不会给你带来太多好处,如果有的话,它会让你的代码更难理解。您的问题可以通过使用&and|<<运算符的基本位操作来解决。

例如,要找出某个数字中是否设置了某个位,您可以 & 对应的 2 幂的数字。这导致:

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

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

于 2012-02-06T19:23:07.127 回答