Получить INT MAX с битовыми операциями
как я могу получить значение INT_MAX
используя только побитовые операторы в C? Я ожидал ~0
на 1111111111
(дополнение 1
, поэтому decimal -1
) и ~0 >> 1
на 0111111111
, что было бы Макс, но это все еще -1
.
почему это и как я могу получить значение INT_MAX
с помощью операции?
6 ответов
попробовать ~0UL >> 1
. Проблема в том, что C будет выполнять сдвиг вправо со знаком, если он имеет дело со знаковым типом. Вот почему вы все еще получаете отрицательный результат - потому что он смещается еще на 1 бит, чтобы соответствовать 1 биту, который был там. (Туда -8
>> 1 дает -4
Как вы хотите для быстрого деления на два.)
Если вы сдвинете отрицательное число вправо, новые биты числа могут быть 1 (чтобы сохранить его отрицательным). Вот почему вы получаете -1.
Edit: вы можете сделать что-то вроде:
int i=1;
while (i<<1) i<<=1;
i=~i;
Если вы относитесь к 0
как целое число без знака компилятор не будет выполнять сдвиг со знаком:
int i = ~0U >> 1;
Это даст вам INT_MAX
насколько я знаю, нет портативного решения, кроме как использовать INT_MAX
макрос. См. мой давний вопрос:
программно определение максимального значения целочисленного типа со знаком
и вопрос, на котором он основан:
C вопрос: off_t (и другие целочисленные типы со знаком) минимальные и максимальные значения
(1
Как хорошо. Это старая тема, но я все равно опубликую ее для любого, кто ее загуглит. Но это не совсем побитовое, и предполагается, что" int " на вашей машине 32bit.
#include <stdio.h>
int main(){
int max = ~0U >> 1;
int min = ~max;
printf("Max = 0x%X, min = 0x%X", max, min);
return 0;
}
выход:
Max = 0x7FFFFFFF, min = 0x80000000