Сдвиг влево / вправо, добавление нулей / единиц и удаление первых битов

Я должен запрограммировать функцию, которая получает

  • двоичное число, подобное 10001, а также
  • десятичное число, которое указывает, сколько смен я должен выполнить.

Проблема в том, что если я использую оператор C ++ <<нули выталкиваются сзади, но первые числа не сбрасываются … Например,

shifLeftAddingZeroes (10001,1)

возвращается 100010 вместо 00010 это то, что я хочу.

Я надеюсь, что я ясно дал понять = P

1

Решение

Я предполагаю, что вы храните эту информацию в Int. Примите во внимание, что это число на самом деле имеет больше начальных нулей, чем вы видите, поэтому ваше число, скорее всего, 16 бит, что означает 00000000 00000001 , Может быть, попробовать И-это с номером, имеющим столько же, сколько число, которое вы хотите иметь после сдвига? (Предполагая, что вы хотите придерживаться побитовых операций).

0

Другие решения

Вам нужно сдвинуть бит, а затем ограничить количество выходных битов, которые могут быть активными (удерживайте значение 1). Один из способов сделать это — создать маску для нужного вам количества битов, а затем И значение сдвига битов с этой маской. Ниже приведен пример кода для этого, просто замените int_type на тип значения, которое вы используете — или сделайте его типом шаблона.

int_type shiftLeftLimitingBitSize(int_type value, int numshift, int_type numbits=some_default) {
int_type mask = 0;
for (unsigned int bit=0; bit < numbits; bit++) {
mask += 1 << bit;
}
return (value << numshift) & mask;
}

Ваш вывод для 10001,1 теперь будет shiftLeftLimitingBitSize(0b10001, 1, 5) == 0b00010,

Поймите, что, если ваши числа не соответствуют длине целочисленного типа, у вас всегда будут лишние 0 бит на передней части вашего числа.

0

По вопросам рекламы [email protected]