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