Как добавить четный бит четности на 7-битном двоичном числе - PullRequest
1 голос
/ 06 февраля 2012

Я продолжаю с моего предыдущего вопроса. Я делаю программу на 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);

Ответы [ 3 ]

2 голосов
/ 07 февраля 2012

Может быть веселее продублировать схему, которую они используют для этого ..

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, иначе все пойдет не так. </p>

ооо не заметил тег домашней работы, не используйте его, если не можете его объяснить.

1 голос
/ 24 мая 2013

Почти тот же процесс, только намного быстрее на большем количестве бит.Использование только арифметических операторов (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);
}
0 голосов
/ 06 февраля 2012

Использование BitArray не стоит здесь много, во всяком случае, затрудняет понимание вашего кода.Ваша проблема может быть решена с помощью базовой битовой манипуляции с помощью операторов & и | и <<.

Например, чтобы узнать, установлен ли определенный бит в числе, которое вы можете & номер ссоответствующая степень 2. Это приводит к:

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

Теперь остается только определить, является ли bitsSet четным или нечетным, и затем установить оставшийся бит при необходимости.

...