1

前回の質問の続きです。ユーザーが 7 ビットの 2 進数を入力すると、コンピューターが数値の右側に偶数パリティ ビットを付けて数値を出力する ac# プログラムを作成しています。私は苦労しています。コードがありますが、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

a を使用してBitArrayも、コードが理解しにくくなります。&この問題は、 and および|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 に答える