GCC在编译下面的代码时会出错。评论的两行代替其他或和 shift 行,但我不确定这些演员是否必要且是真的。
错误是这样的:二进制|的无效操作数(有'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中的参考传递示例让我感到困惑。
答案 0 :(得分:4)
为什么要对指针进行按位操作?这不是一个好主意,这就是为什么你会遇到编译错误。
您需要使用*
取消引用指针,以获取可以执行以下操作的值:
*byte |= 1;
或
*byte <<= 1;
注意使用|=
和<<=
运算符可以使代码更简单,这在处理指针时更有用,因为“target”表达式比直接变量更长。
答案 1 :(得分:2)
C标准规定此类运算符的操作数应具有标量类型。
C11(n1570),§6.5.14逻辑OR运算符
每个操作数都应具有标量类型。
您可以转为intptr_t
(C99 / C11)。
#include <stdint.h>
intptr_t n = (void *)byte;
无论如何,很难说你想做什么。你不想对指针指向的值执行此操作吗?在这种情况下,你必须取消引用它。
*byte = *byte | 0x01;
答案 2 :(得分: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);
}