我正在尝试使用 linux 从命令行提取 char 参数,我已经成功完成了,现在我想反转文件的位,此代码在使用 char 类型时运行良好,但我无法使用命令行 arg 。
我得到的错误是:二进制操作数无效(有 unsigned char * 和 int)
printf("%d", !!((b << i) & 0x80));
和线
temp = (b & (1 << j));
代码如下:
void revBits(unsigned char *b)
{
int i;
printf("Original Number: ");
for (i = 0; i < 8; i++) {
printf("%d", !!((b << i) & 0x80));
}
printf("\n");
unsigned int NO_OF_BITS = sizeof(b) * 8;
unsigned int reverse_num = 0, j, temp;
for (j = 0; j < NO_OF_BITS; j++)
{
temp = (b & (1 << j));
if(temp)
reverse_num |= (1 << ((NO_OF_BITS - 1) - j));
}
printf("When reversed: %d\n",reverse_num);
}
最佳答案
你不能假设 char 中的位数是 8 并在那里插入那个魔术常量,正如 C 的定义所说,它必须至少为 8,但没有上限,否则你的代码是不便于携带。
接下来,sizeof(char) = 1,即使 char 类型是在 16、64 位等上实现的。有些编译器在 64 位上实现 char,只是为了避免执行任何类型的隐式算术转换。
位数可以在 limits.h
中找到,名为 CHAR_BIT 的宏,在我的例子中,它是由我的编译器定义的:
/* Number of bits in a `char'. */
# define CHAR_BIT 8
反转字节的方法有很多,这里是一种方法(假设您的代码在 8 位或 16 位上实现它,您可以保留一个预先计算的表):
char rev_byte(char byte) {
char reversed_table = {0x00, 0x80, 0x40, ...};
return reversed_table[byte];
}
这里是另一种反转字节 char x
中位的方法,假设一个字节有 8 位。我还解释了由一些按位指令组成的算法的每一步。
假设
X = [ a b c d e f g h ] INITIALLY
/* 0x55 = ~0xAA -- 0101 0101 ~ 1010 1010 /*
/* switch 8 groups of 1 */
x = (x & 0x55) << 1 | (x & 0xAA) >> 1;
==> X = [ b a d c f e h g ]
/* switch 4 groups of 2 now */
x = (x & 0x33) << 2 | (x & 0xCC) >> 2;
==> X = [ d c b a h g f e ]
/* switch 2 groups of 4 now */
x = (x & 0x0F) << 4 | (x & 0xF0) >> 4;
==> X = [ h g f e d c b a ]
关于c - 我如何摆脱这个已经尝试了一天的错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46988265/