Я должен запрограммировать функцию, которая получает
10001
, а такжеПроблема в том, что если я использую оператор C ++ <<
нули выталкиваются сзади, но первые числа не сбрасываются … Например,
shifLeftAddingZeroes (10001,1)
возвращается 100010
вместо 00010
это то, что я хочу.
Я надеюсь, что я ясно дал понять = P
Я предполагаю, что вы храните эту информацию в Int. Примите во внимание, что это число на самом деле имеет больше начальных нулей, чем вы видите, поэтому ваше число, скорее всего, 16 бит, что означает 00000000 00000001
, Может быть, попробовать И-это с номером, имеющим столько же, сколько число, которое вы хотите иметь после сдвига? (Предполагая, что вы хотите придерживаться побитовых операций).
Вам нужно сдвинуть бит, а затем ограничить количество выходных битов, которые могут быть активными (удерживайте значение 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 бит на передней части вашего числа.