Тип size_t
- это неподписанный тип. Таким образом, смещение вправо значения типа size_t
будет логически изменяться. Учитывая, что ширина size_t
зависит от реализации, существует ли способ правого сдвига а size_t
значение арифметически?Арифметическое правое смещение значение size_t
Если моя цель - создать битовую маску из значения size_t
, содержащего 1
или 0
, есть ли другой способ сделать это? Для целых чисел с известными ширинами самый простой способ, которым я знаю, создать битовую маску, - это сдвиг влево по ширине целого числа - 1, а затем арифметический сдвиг вправо до конца.
Это работает на моем 64-битной системе:
const size_t width = (sizeof(size_t) << 3)) - 1;
size_t value = {boolean value};
value = ((int64_t) (value << width)) >> width;
Но, конечно, это относится исключительно к моей системе и системы, как это. Что я могу использовать вместо этого?
Если я правильно понял, что вы хотите, то эффективно 'size_t mask = original? -1: 0; ', если« создавая маску из значения, содержащего 1 или 0 », вы имеете в виду расширение знака от 1 бит до того, сколько битов имеет размер' size_t'. –
Да, в значительной степени. Часть меня хотела сделать это без тройного оператора. Но мне все еще любопытно, есть ли хороший способ сделать арифметическую правую смену. – skeggse
Почему нисходящий, кто-нибудь? – skeggse