c - 如何在 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 的初学者,很抱歉我的风格不好。事先谢谢你。
解决方案
LSB 仅通过使用位掩码进行掩码来给出:input[i] & 0xFF
。
您发布的代码在input[i] >> 8
此之前给出了下一个字节。但是,它也给出了碰巧存储在最高有效字节中的任何内容,以防int
32 位。所以你需要再次屏蔽,(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 表示。但是请注意,实际的位移是与字节序无关的,而且速度也很快,这就是为什么它是一种优越的方法。
基于联合或指针算术的解决方案依赖于字节序,并且经常出现错误(违反指针别名),因此应该避免使用它们,因为使用它们没有任何好处。
推荐阅读
- dynamics-crm - Dynamics CRM 中的搜索功能
- php - php中的多步表单
- kubernetes - Kops 暂停集群应该使 EC2 实例集群处于停止状态
- design-patterns - 如何拥有特质的私密部分?
- sql - 如何转到下一个或上一个记录
- mpi - MPI_Isend/MPI_Recv 与 MPI_Send/MPI_Irecv
- python-3.x - 如何更新字典计数器?
- python-3.x - 通过部分关键python获取dict值
- java - 使用 VAADIN 填充文本字段时如何启用按钮
- git - 为什么 git diff 只使用选项 --cached?