c - 如何在C中将16位值拆分为两个8位值

标签 c binary bit-manipulation

我不知道这个问题是否正确,但是。

例如,十进制为25441,二进制为110001101100001。如何将其拆分为两个8位“1100011”和“01100001”(即“99”和“97”)。然而,我只能想到使用位操作将其移动>>8,而我无法对“97”执行其余操作。这是我的功能,它不是一个好的功能,但我希望它有所帮助:

void reversecode(int input[], char result[]) {  //input is 25441
int i;
for (i = 0; i < 1; i++) {  
    result[i] = input[i] >> 8;                  // shift by 8 bit
    printf("%i", result[i]);                    //to print result
}
}

我正在考虑使用结构,但我不知道如何启动它。我是 C 语言的初学者,很抱歉我的糟糕风格。谢谢你之前。

最佳答案

LSB 只需通过位掩码进行掩码即可给出:input[i] & 0xFF

您发布的代码 input[i] >> 8 给出了之前的下一个字节。然而,如果 int 是 32 位,它也会给出存储在最高有效字节中的任何内容。因此,您再次需要屏蔽 (input[i] >> 8) & 0xFF

还要避免对有符号类型(例如 int)进行位移位,因为如果它们具有负值,则会调用指定不当的行为,从而导致错误。

屏蔽 int 各个字节的正确方法是:

// 16 bit system  
uint8_t bytes [sizeof(int)] = 
{
  ((uint16_t)i >> 0) & 0xFF,  // shift by 0 not needed, of course, just stylistic
  ((uint16_t)i >> 8) & 0xFF,
};

// 32 bit system  
uint8_t bytes [sizeof(int)] = 
{
  ((uint32_t)i >>  0) & 0xFF,
  ((uint32_t)i >>  8) & 0xFF,
  ((uint32_t)i >> 16) & 0xFF,
  ((uint32_t)i >> 24) & 0xFF,
};

这会将 LSB 置于该数组中的索引 0 处,类似于内存中的 Little Endian 表示形式。但请注意,实际的位移位与字节顺序无关,而且速度很快,这就是为什么它是一种优越的方法。

基于 union 或指针算术的解决方案取决于字节顺序,并且经常存在错误(指针别名冲突),因此应该避免使用它们,因为使用它们没有任何好处。

关于c - 如何在C中将16位值拆分为两个8位值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53367838/

相关文章:

c - pic32 跳出引导加载程序导致一般异常

python - 通过套接字连接将图像从客户端发送到服务器

python - 通过一些数字的所有二进制组合作为 "?"

java - 如何在Java中迭代一个字节的所有位?

bit-manipulation - 如何使用 AND、XOR 和 shift 计算按位或?

floating-point - 遍历所有可能的浮点值

c - Do While 不在 CUDA 内核中工作

c - 从C中的链表中删除最后两个元素

c - 如何用 C 内部的另一个结构指针初始化一个结构指针?

c++ - 将 double 转换为 C(++) 中遗传算法的位数组