首页 > 解决方案 > 如何在 C 中将 16 值拆分为两个 8 位值

问题描述

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

例如,十进制为 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
}
}

我正在考虑使用 struct 但我不知道如何启动它。我是 C 的初学者,很抱歉我的风格不好。事先谢谢你。

标签: cbinarybit-manipulation

解决方案


LSB 仅通过使用位掩码进行掩码来给出:input[i] & 0xFF

您发布的代码在input[i] >> 8此之前给出了下一个字节。但是,它也给出了碰巧存储在最高有效字节中的任何内容,以防int32 位。所以你需要再次屏蔽,(input[i] >> 8) & 0xFF.

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

屏蔽 an 的各个字节的正确方法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 表示。但是请注意,实际的位移是与字节序无关的,而且速度也很快,这就是为什么它是一种优越的方法。

基于联合或指针算术的解决方案依赖于字节序,并且经常出现错误(违反指针别名),因此应该避免使用它们,因为使用它们没有任何好处。


推荐阅读