Пожалуйста, объясните вывод - PullRequest
1 голос
/ 13 апреля 2011
#include<stdio.h>

int main(void) 
{
    int a=-3,b=5,c;
    c=a|b;
    printf("%d ",c);
    c=a&b;
    printf("%d ",c);
}

Вывод -3 5, объясните пожалуйста как?

Ответы [ 7 ]

7 голосов
/ 13 апреля 2011

Чтобы понять вывод, вам необходимо ознакомиться с дополнением к двум , которое используется для представления отрицательных двоичных чисел. Преобразование из + x в -x на самом деле довольно просто: дополнить все биты и добавить один. Теперь просто предположим, что ваши целые имеют длину 8 бит (этого достаточно для проверки 5 и -3):

5: 0000 0101
3: 0000 0011 => -3: 1111 1101

Теперь давайте посмотрим на побитовый или:

1111 1101 | 0000 0101 = 1111 1101

Точно репрезентация -3

А теперь побитовое И:

1111 1101 & 0000 0101 = 0000 0101

Именно двоичное представление 5

2 голосов
/ 13 апреля 2011

Это помогает, когда вы смотрите на двоичные представления рядом друг с другом:

  • -3 == 1111 1111 1111 1101
  • +5 == 0000 0000 0000 0101

Что нужно понятьв том, что и |, и & оставят немного в покое, если оно имеет одинаковое значение с обеих сторон.Если значения отличаются (то есть один операнд имеет 0 в этой позиции, а другой - 1), то одно из них «выигрывает», в зависимости от того, используете ли вы | или &.

Когда вы ИЛИ эти биты вместе, выигрываете 1с.Однако 5 имеет 0 в той же позиции, что и 0 в -3, так что бит поступает через операцию ИЛИ без изменений.Результат (1111 1111 1111 1101) остается таким же, как и -3.

Когда вы выполняете битовое И, нули выигрывают.Однако 1 из 5 совпадают с 1 из 3, поэтому эти биты проходят через операцию И без изменений.Результат еще 5.

1 голос
/ 13 апреля 2011

Двоичный код 5 --is -> 0000 0101

3 --> 0000 0011 - 1's Complement -> 1111 1100 - 2's Complement (add 1) -> 1111 1101 == -3. Вот как он хранится в памяти.

Битовая ИЛИ Таблица правды:

           p OR q

p     ||    q      ||   p | q
T(1)  ||    T(1)   ||     T(1)
T(1)  ||    F(0)   ||     T(1)
F(0)  ||    T(1)   ||     T(1)
F(0)  ||    F(0)   ||     F(0)

1111 1101 | 0000 0101 = 1111 1101 == -3

Таблица побитовых и истинных значений:

          p AND q 

p     ||    q      ||   p & q
T(1)  ||    T(1)   ||     T(1)
T(1)  ||    F(0)   ||     F(0)
F(0)  ||    T(1)   ||     F(0)
F(0)  ||    F(0)   ||     F(0)

1111 1101 & 0000 0101 = 0000 0101 == 5

Кроме того, см. - Что должен знать каждый ученый об арифметике с плавающей точкой .

0 голосов
/ 13 апреля 2011

Когда-либо слышали о законе Деморгана ... ??? Подсказка в linky , это таблица, которая воплощает и воплощает грубую холодную правду логики, которая закреплена в синтаксисах основных языковых компиляторов ...

Еще большее беспокойство вызывает тот факт, что у вас нет базовых знаний по CS101, и вы пишете этот вопрос (извините, если вы считаете это снисходительным, но это не так), я искренне не могу поверить, что вы смотрите на код C и не сказал ничего о двух дополнениях, побитовой логике ... что-то здесь очень не так ... Если ваш преподаватель колледжа не сказал вам ничего из этого, сказал, что преподаватель вообще не должен читать лекции и найти другую работу .... вздох

0 голосов
/ 13 апреля 2011

Если вы знаете все о дополнениях 2, то вы должны

  1. знать, как записать 3 и 5 в дополнении 2 как бит31, бит32 ... бит3н и бит51, бит52 ... бит5н
  2. как вычислить результат bit3i |bit5i для i = 0 ... n
  3. как преобразовать результат обратно в базу 10

Это должно дать вам ваш ответ для первого, то же самое с & длявторой.

0 голосов
/ 13 апреля 2011

-3 = 0xFFFD = 1111 1111 1111 1101 5 = 0101, поэтому побитовый или не изменяет первый аргумент (просто перекрывают один с одним) и результаты по-прежнему -3

Поразрядно и принимает комоновые числа между 1101 и 0101, что составляет 0101 = 5 :) нет причин считать все завершающие единицы в -3, так как 5 = 0000 0000 0000 0101

0 голосов
/ 13 апреля 2011

Получите немного бумаги и пишущий инструмент на ваш выбор

Запишите -3 и 5 в двоичном виде (см. дополнение к двум , как делать отрицательные числа)

подсказка: |означает ИЛИ & означает И

...