【问题标题】:How to add even parity bit on 7-bit binary number如何在 7 位二进制数上添加偶校验位
【发布时间】:2012-02-28 06:20:29
【问题描述】:

我继续我之前的问题。我正在制作一个 c# 程序,其中用户输入一个 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);

【问题讨论】:

  • 请格式化您的代码。您可以制作一个查找表以使其更简单。
  • 阅读错误信息。查看您选择的命名空间名称。选择一个名称,任何名称,而不是“BitArray”。

标签: c# binary parity


【解决方案1】:

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

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

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

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

【讨论】:

  • 我应该如何处理 BitArray bits = new BitArray(numberasByte) 因为它说它是一个命名空间但用作一种类型,我应该如何处理 ((number & (1 0) 正如它所说的在当前上下文中不存在?你能用代码告诉我吗?
  • @AsharAslam:您必须将数字定义为 int,就像在您的示例中您可以使用 int number = Convert.ToInt32(Console.ReadLine()); 一样。你根本不需要 BitArray 代码
  • 现在它说在当前上下文@Broken Glass 中没有定义位。我投了这个答案
  • @AsharAslam:既然这是作业,我就不给你写代码了,你必须做传输工作
  • 我只是想知道,您是否会像 int number 一样,将 string、bool、int 等内容与 bits 放在一起?
【解决方案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 你可能要检查输入是否为

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

【讨论】:

  • 谢谢,我理解布尔值,因为布尔值(真/假)。我得到了其余的,但唯一的问题是在当前上下文中显然不存在位。是string、bool、int等吗?
  • 您的代码中唯一提到了位,我和破碎的玻璃都没有提到它们。我们使用移位运算符和索引。您不需要的 BitArray 类位于 System.Collections 命名空间中,但是当您将代码放在名为 BitArray 的命名空间中时,您将其隐藏了。 @Hans 告诉过你。将代码中的命名空间 BitArray 更改为命名空间中尚未在我正在使用的命名空间中使用的任何其他内容。提示选择更好的命名空间,Ashar.Homework.Exercise1 会解决您的问题。
【解决方案3】:

几乎相同的过程,只是在更多的位上更快。仅使用算术运算符 (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-01-26
    • 2017-03-01
    • 2012-02-27
    • 2015-06-29
    • 2015-04-04
    • 2010-12-25
    • 1970-01-01
    • 2016-01-31
    相关资源
    最近更新 更多