Двоичное представление числа в C - PullRequest
6 голосов
/ 06 февраля 2010

Я наткнулся на этот код для двоичного представления числа. Я хочу знать необходимость использования! в коде.

int main() {
    int n,i;
    unsigned flag = 1<<(sizeof(int) * 8 - 1);     

    printf("Input the number\n");
    scanf("%d",&n);     
    for(i=0;i<sizeof(int)*8;i++) {    
            printf("%d",!!(n & flag) );    
            n = n << 1;
    }
    return 0;
}

Ответы [ 3 ]

10 голосов
/ 06 февраля 2010

!! преобразует любое ненулевое значение в 1 и оставляет нулевое значение равным нулю.

x = 0;
y = 50;
!x; // 1
!y; // 0
!!x; // 0
!!y; // 1

Это заклинание бедняков.

7 голосов
/ 06 февраля 2010

Используемый флаг имеет только установленный MSB и все остальные биты сброшены, так что когда вы наберете bitwise and с номером, вы можете проверить MSB в числе.

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

  • Ноль - означает, что число имеет 0 в MSB.
  • Non-Zero - означает, что число имеет 1 в его MSB.

Теперь нам нужен способ отображения

Non-zero -> 1
Zero -> 0

поэтому мы используем двойное отрицание.

То же самое можно было бы сделать, используя:

for(i=0;i<sizeof(int)*8;i++) {

    (n & flag) ? printf("1"):printf("0");
    n = n << 1;
}
2 голосов
/ 06 февраля 2010

Я бы написал !!x менее смутно как x != 0.

...