c - 我如何摆脱这个已经尝试了一天的错误?

标签 c

我正在尝试使用 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/

相关文章:

c++ - 使用 Eclipse : How to add include paths and libraries for all your C/C++ project

c - 全局结构数组

c++ - -O3(优化级别 3)有什么问题?

c - 指针由于某种原因显示垃圾

c - 这个声明在 x86-64 上有什么问题?

c - 在 Mac OSX 下检测连接的 USB 设备

c++ - 为什么 Malloc() 关心边界对齐?

c - 在开始使用指向它的指针而不是制作副本之前,结构应该有多大? [C]

c++ - 将文本添加到 jpeg

c++ - 指向一个数组以获取其所有内容