Как добавить четный бит четности на 7-битном двоичном числе

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

3 ответа

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

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

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

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

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

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

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

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

Другие вопросы по тегам