Получить 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