Lac*_*lus 0 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
}
}
Run Code Online (Sandbox Code Playgroud)
我正在考虑使用 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,
};
Run Code Online (Sandbox Code Playgroud)
这会将 LSB 置于该数组中的索引 0 处,类似于内存中的 Little Endian 表示形式。但请注意,实际的位移位与字节顺序无关,而且速度很快,这就是为什么它是一种优越的方法。
基于联合或指针算术的解决方案取决于字节顺序,并且通常存在错误(指针别名冲突),因此应避免使用它们,因为使用它们没有任何好处。
| 归档时间: |
|
| 查看次数: |
25942 次 |
| 最近记录: |