2

GCC 在编译下面的代码时会出错。注释的两行而不是另一行orshift行,但我不确定铸件是否必要和真实。

错误是这样的:二进制的无效操作数 | (有 'char*' 和 'int')

谢谢。

void bits2byte(int *bits, char *byte) {
    byte = 0;
    int i;
    for (i = 0; i<8; i++) {
        if (bits[i] == 1) {
            byte = byte | 0x01;
            // byte = (char*)((int)byte | 0x01);
        }
        if (i<7) {
            byte = byte << 0x01;
            // byte = (char*)((int)byte << 0x01);
        }
    }
}
int main() {
    int input_bits[] = {1, 1, 0, 1, 0, 0, 1, 1};
    char output_byte;
    bits2byte(input_bits, &output_byte);
}

编辑:我知道这是一个通过引用的问题。我正在尝试修改字节。我希望该函数将位转换为字节。实际上,我首先按照所有回答者/评论者建议的方式编写了它,但是http://publib.boulder.ibm.com/infocenter/lnxpcomp/v8v101/index.jsp?topic=%2Fcom中的参考传递示例.ibm.xlcpp8l.doc%2Flanguage%2Fref%2Fcplr233.htm 让我很困惑。

4

3 回答 3

4

为什么要对指针进行按位运算?这不是一个好主意,这就是您遇到编译器错误的原因。

您需要取消引用指针*以获取可以执行以下操作的值:

*byte |= 1;

或者

*byte <<= 1;

注意使用|=and<<=运算符可以使代码更简单,这在使用指针时更加有用,因为“目标”表达式比直接变量长。

于 2013-01-23T15:36:52.293 回答
2

C 标准规定此类运算符的操作数应具有标量类型。

C11 (n1570), § 6.5.14 逻辑或运算符
每个操作数都应具有标量类型。

您可以投射到intptr_t(C99/C11)。

#include <stdint.h>

intptr_t n = (void *)byte;

无论如何,很难说你想要做什么。你不想对指针指向的值做这个操作吗?在这种情况下,您必须取消引用它。

*byte = *byte | 0x01;
于 2013-01-23T15:37:31.357 回答
1

这就是你想要做的(我认为)

void bits2byte(int *bits, char *byte) {
    //notice ALL the work is with "*byte" not "byte" which is the address of the byte.
    *byte = 0;
    for (int i = 0; i < 8; i++) {
        *byte <<= 1;
        if (bits[i] == 1) {
            *byte |= 1;
        }
    }
}

int main() {
    int input_bits[] = {1, 1, 0, 1, 0, 0, 1, 1};
    char output_byte; //no use to put value here, we'll override it anyway...
    bits2byte(input_bits, &output_byte);
}
于 2013-01-23T15:42:11.893 回答