Hex to bin после логических операций - PullRequest
2 голосов
/ 02 июня 2010

Я хочу:

111 || 100  ---> 111,  not 1
100 && 100  ---> 100,  not 1
101 && 010  ---> 000,  not 0

Сломанный код

#include <stdio.h>

main(void){
        string hexa = 0xff;
        strig hexa2 = 0xf1;

        // CONVERT TO INT??? cast
        int hexa3 = hexa || hexa2;
        int hexa4 = hexa && hexa2;

        puts(hexa3);
        puts(hexa4);
}

Ответы [ 2 ]

11 голосов
/ 02 июня 2010

Требуется побитовые операторы (|, &) вместо логических операторов (||, &&):

110 | 011 --> 111
110 & 101 --> 100

Что касается вашего неработающего кода, у вас также есть неправильные типы для hexa и hexb, которые оба должны быть числовыми:

int hexa = 0xff;
int hexa2 = 0xf1;

Наконец, чтобы вывести целое число, вы должны использовать printf для их форматирования:

printf("hexa3 = 0x%08x\n", heaxa3);   // display as 8 digit, 0 padded hex
1 голос
/ 02 июня 2010
  1. string - неправильный тип данных здесь. Существует большая разница между числом 0xff (которое 11111111 в двоичном виде) и строкой "0xff". Я предполагаю, что вы хотите иметь дело с первым; Разбор строк в целые числа - это отдельная тема. Один хороший тип данных для последовательности из 16 битов: unsigned int.
  2. Существует большая разница между || и | Первый выполняет так называемый «логический» или: он преобразует оба операнда в логическое значение, а затем возвращает истину, если хотя бы один из операндов является истинным, и ложь в противном случае. Операнд преобразуется в false, если он равен 0, в противном случае - true. Таким образом, для вашего примера 0xff и 0xf1 оба преобразуются в true, и true || правда == правда. Вот почему ваш код печатает 1.

Примечание: даже для логических значений, || и | различаются из-за короткого замыкания: если у вас a || b, b оценивается, только если a ложно. Оба аргумента оцениваются для a | b. Это имеет значение, т. Е. Когда один из двух операндов является вызовом функции с побочными эффектами.

...