Можете ли вы контролировать то, что побитовый сдвиг вправо заполнит C?

Насколько я знаю, когда вы используете побитовый оператор сдвига влево в C, это гарантирует, что пустые биты будут заполнены нулями. Однако я читал, что сдвиг вправо зависит от реализации, то есть на некоторых машинах пустые биты будут заполнены нулями, а в других они будут заполнены единицами.

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

Есть ли способ принудительно использовать нули при сдвиге вправо?

Одним из решений было бы, после применения сдвига вправо, создать маску типа 011111111 и затем применить побитовое И, которое изменит крайний левый 1, который был вставлен в 0.

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

Спасибо

27
задан Daniel Scocco 7 December 2011 в 20:19
поделиться

2 ответа

Приведите число к unsigned и затем сдвиньте. Это заставит 0-заполнить.

39
ответ дан 28 November 2019 в 04:44
поделиться

Существуют две разные операции смещения вправо: арифметическая и логическая.

Логический сдвиг используется с числами без знака в C. Он всегда заполняет старшие биты нулями. Это то, что вам нужно.

Арифметическое смещение используется со знаковыми числами, потому что оно сохраняет знак смещаемого числа. Если число положительное, самый значимый бит будет равен 0 и заполнится нулями. Если число отрицательное, самый значимый бит будет равен 1, поэтому он заполнится 1 с.

Обратите внимание, что в Java они фактически используют разные операторы: >> для арифметики, >>> для логики. Это необходимо, потому что у Java нет беззнакового типа.

5
ответ дан 28 November 2019 в 04:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: