c - 使用字节重新排序的位移位方法时,按位与 255 的意义何在?

标签 c bit-manipulation byte endianness

an article ,解释小/大端主题,并包含一个字节序转换函数的例子:

short reverseShort (short s) {
    unsigned char c1, c2;

    if (is_bigendian()) {
        return s;
    } else {
        c1 = s & 255;
        c2 = (s >> 8) & 255;

        return (c1 << 8) + c2;
    }
}

我明白了,为什么他们会在这里:

c1 = s & 255;

255 = 11111111,所以按位和 s 可能类似于 1011011010010010,不会影响数字在最后 8 个位置,但将所有前导位置变为零。所以它削减位到结尾 8。

我也明白,为什么他们在这里使用右移:

c2 = (s >> 8) & 255;

移位 8 会删除最后 8 位,因此保留前 8 位。所以在第一个操作中,他们得到最后 8 位,然后是前 8 位。

但为什么他们再次用 255 对其进行“与”处理?

最佳答案

假设 s = 二进制表示:abcdefghijklmnopqrst

c1 = s & 255; // < mnopqrst first 8 bits
c2 = (s >> 8) & 255;  //    from abcdefghijklmnopqrst >> 8 = abcdefghijkl & b11111111 = efghijkl

return (c1 << 8) + c2; // < (mnopqrst00000000) + efghijkl = mnopqrstefghijkl

它本质上是取前 8 位和接下来的 8 位,然后反转它们

But why they 'and'-ing it with 255 again?

如果它更长,那就将它截断为 8 位

关于c - 使用字节重新排序的位移位方法时,按位与 255 的意义何在?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32277760/

相关文章:

c - [curl lib]如何获得响应/重定向 url?

c - x86-32 上 C 中的堆栈溢出和段错误

c++ - C 中的位运算符

java - 在 Java 中获取 int 的特定位子集

在C中将char数组转换为int

java - 使用java中的移位将有符号字节数组内容转换为十进制

c - 如果 GTK 无法创建新对象会怎样?

C - 某些方法不是从菜单方法调用的

将字节的位转换为单个位并返回

java - Java(字节)文字转换效率高吗?