Битовые операции в Си - PullRequest
       1

Битовые операции в Си

0 голосов
/ 28 сентября 2011

Я работаю над заданием по программированию на C, мне нужно смоделировать работу 3-битного декодера.Мой компилятор жалуется, эта статья в Википедии содержит список операторов C, но мой код все еще не работает.

Википедия: http://en.wikipedia.org/wiki/Operators_in_C_and_C%2B%2B#Bitwise_operators

Ошибка компилятора:

logic.c: In function ‘three_bit_decoder’:
logic.c:33: warning: statement with no effect
logic.c:33: error: expected ‘;’ before ‘~’ token
logic.c:34: warning: statement with no effect
logic.c:34: error: expected ‘;’ before ‘b0’
logic.c:35: warning: statement with no effect
logic.c:35: error: expected ‘;’ before ‘~’ token
logic.c:36: warning: statement with no effect
logic.c:36: error: expected ‘;’ before ‘b0’
logic.c:38: warning: statement with no effect
logic.c:38: error: expected ‘;’ before ‘b0’
logic.c:39: warning: statement with no effect
logic.c:39: error: expected ‘;’ before ‘b0’
logic.c:40: warning: statement with no effect
logic.c:40: error: expected ‘;’ before ‘~’ token
logic.c:41: warning: statement with no effect
logic.c:41: error: expected ‘;’ before ‘b0’
logic.c:43: warning: return makes integer from pointer without a cast
logic.c:43: warning: function returns address of local variable
make: *** [logic.o] Error 1

Код:

int three_bit_decoder(BIT b0, BIT b1, BIT b2) {
    /* Returns an 8 bit number, by 2^3
     * 
     */
        int myIntDecoder[8]; 

        myIntDecoder[0] ~b0 + ~b1 + ~b2;
        myIntDecoder[1] b0 + ~b1 + ~b2;
        myIntDecoder[2] ~b0 + b1 + ~b2;
        myIntDecoder[3] b0 + b1 + ~b2;

        myIntDecoder[4] b0 + ~b1 + ~b2;
        myIntDecoder[5] b0 + ~b1 + b2;
        myIntDecoder[6] ~b0 + b1 + b2;
        myIntDecoder[7] b0 + b1 + b2;

        return myIntDecoder;
}

Ответы [ 4 ]

4 голосов
/ 28 сентября 2011

Если это операторы присваивания, вы пропускаете знаки равенства.

myIntDecoder[0] = ~b0 + ~b1 + ~b2;
myIntDecoder[1] = b0 + ~b1 + ~b2;
myIntDecoder[2] = ~b0 + b1 + ~b2;
myIntDecoder[3] = b0 + b1 + ~b2;

myIntDecoder[4] = b0 + ~b1 + ~b2;
myIntDecoder[5] = b0 + ~b1 + b2;
myIntDecoder[6] = ~b0 + b1 + b2;
myIntDecoder[7] = b0 + b1 + b2;

Следующая проблема, с которой вы столкнетесь, заключается в том, что int myIntDecoder[8] объявляет массив из 8-ми дюймов, который отличается от 8-битного типа int. A char имеет ширину 8 бит на (почти) всех платформах; или вы можете быть более явным и использовать одну из стандартных typedefs:

#include <stdint.h>

uint8_t myIntDecoder;

Чтобы не оставлять вас в покое, я должен упомянуть, что присвоение отдельным битам в переменной не так просто, как byte[5] = 1. Выполнение этого требует некоторого умного использования сдвига и других побитовых операций.

1 голос
/ 28 сентября 2011

Предположительно, вам нужно что-то вроде:

   myIntDecoder[0] = ~b0 + ~b1 + ~b2;
   // and likewise for the other 7 lines

Хотя это не поможет при попытке вернуть myIntDecoder.Для этого вы, вероятно, захотите переместить массив за пределы функции и (для одного примера) передать его адрес в функцию.

1 голос
/ 28 сентября 2011

Битовые операторы не являются вашей проблемой, в вашем коде есть синтаксические ошибки.Подумайте о том, как сделать присвоение переменных, и решение должно прийти к вам.

0 голосов
/ 28 сентября 2011

вам не хватает оператора равенства.

myIntDecoder[7] = b0 + b1 + b2;

Также оператор not в c равен ! not ~

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...