C # аналогичные побитовые операции, приводящие к различным ответам - PullRequest
0 голосов
/ 10 декабря 2018

В настоящее время я пишу решение для проекта в своем классе CS и получаю противоречивые результаты.

По сути, мне нужно прочитать один бит из байта, который читается из файла.

Это соответствующие методы (игнорируйте стандарты именования, я их не создавал и тоже ненавижу):

static bool no_more_bytes()
/**********************/
/*** NO MORE BYTES? ***/
/**********************/
{
    return (in_stream.PeekChar() == -1);
}

static byte read_a_byte()
/********************************************************************************/
/*** Function to read a single byte from the input stream and set end_of_file ***/
/********************************************************************************/
{
    byte abyte;

    if (!no_more_bytes())
        abyte = in_stream.ReadByte();
    else
    {
        abyte = 0;
        end_of_file = true;
    }

    return abyte;
}

static byte getbit()
/**********************************************************/
/*** Function to get a single BIT from the input stream ***/
/**********************************************************/
{
    byte mask;

    if (current_byte == 0 || current_bit_position == 8)
    {
        current_byte = read_a_byte();
        current_bit_position = 0;
    }

    mask = current_bit_position;
    current_bit_position++;

    //Your job is to fill in this function so it returns
    //either a zero or a one for each bit in the file. 

    bool set = (current_byte & (128 >> current_bit_position - 1)) != 0; // This is the line in question
    if (set)
    {
        return 1;
    } else
    {
        return 0;
    }
}

getbit () - метод, который я написал, иэто работает правильно.Однако мое первое решение не сработало.

Когда входной файл содержит «ABC», он правильно выводит 01000001 00100001 01100001 (65, 66, 67), считывая по 1 биту за раз.

Однако, мое первоначальное решение было

bool set = (current_byte & (1 << current_bit_position - 1)) != 0;

Итак, вопрос: почему сдвиг 128 вправо на current_bit_position дает другой результат, чем сдвиг 1 влево на current_bit_position

1 Ответ

0 голосов
/ 10 декабря 2018

Я собираюсь интерпретировать этот вопрос как вопрос о порядке следования битов, потому что, как показывают комментарии, не имеет большого смысла ожидать, что разные операции над одними и теми же данными в большинстве случаев будут возвращать один и тот же результат.

Так почему же мы начинаем с 128 и смещаемся вправо, а не с 1 и смещаемся влево?Оба метода действительны для перечисления каждого бита в байте, но они работают в обратном порядке.

Если вы хотите сдвинуть 1 влево (<<) вместо сдвига 128 вправо (>>) вам нужно было бы запустить current_bit_position с 7 до 0 вместо от 0 до 7.

Сдвиг 1

  • 1 << 7 == 10000000 </li>
  • 1 << 6 == 01000000 </li>
  • 1 << 5 == 00100000 </li>
  • 1 << 4 == 00010000 </li>
  • 1 << 3 == 00001000 </li>
  • 1 << 2 == 00000100 </li>
  • 1 << 1 == 00000010 </li>
  • 1 << 0 == 00000001 </li>

Сдвиг 128

  • 128 >> ​​0 == 10000000
  • 128 >> ​​1 == 01000000
  • 128 >> ​​2 == 00100000
  • 128 >> ​​3== 00010000
  • 128 >> ​​4 == 00001000
  • 128 >> ​​5 == 00000100
  • 128 >> ​​6 == 00000010
  • 128>> 7 == 00000001

Поскольку мы обычно представляем числа с наиболее значимыми цифрами слева и наименее значимыми справа, aпоследовательности bove - это то, что вам нужно использовать, чтобы получить биты в правильном порядке.

...