如何在C语言中将16个值拆分为两个8位值
我不知道这个问题是否正确,但是 例如,十进制数为25441,二进制数为1100011010001。如何将其拆分为两个8位的“1100011”和“0110001”(即“99”和“97”)。然而,我只能考虑使用位操作将其移位>>8,而对于“97”,我无法完成其余的操作。这是我的函数,它不是一个好函数,但我希望它有帮助:如何在C语言中将16个值拆分为两个8位值,c,binary,bit-manipulation,C,Binary,Bit Manipulation,我不知道这个问题是否正确,但是 例如,十进制数为25441,二进制数为1100011010001。如何将其拆分为两个8位的“1100011”和“0110001”(即“99”和“97”)。然而,我只能考虑使用位操作将其移位>>8,而对于“97”,我无法完成其余的操作。这是我的函数,它不是一个好函数,但我希望它有帮助: void reversecode(int input[], char result[]) { //input is 25441 int i; for (i = 0; i <
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
}
}
void reversecode(int-input[],char-result[]){//输入是25441
int i;
对于(i=0;i<1;i++){
结果[i]=输入[i]>>8;//移位8位
printf(“%i”,result[i]);//打印结果
}
}
我想使用struct,但我不知道如何启动它。我是C语言的初学者,很抱歉我的风格不好。谢谢你的光临 您可以使用位屏蔽概念。
这样地,
或者,这也可以通过简单的显式类型转换来实现,因为8位整数仅从16位值中携带LBS 8位,并丢弃剩余的MSB 8位(默认情况下,当分配更大的值时)。这一切都是在位移位后完成的。LSB是通过使用位掩码进行屏蔽给出的:
input[i]&0xFF
您发布的代码input[i]>>8
给出了前面的下一个字节。但是,如果int
是32位,它也会给出恰好存储在最高有效字节中的任何内容。因此,您需要再次屏蔽,(输入[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处,类似于内存中的小端点表示。但是请注意,实际的位移位与endianess无关,而且速度也很快,这就是为什么它是一种优越的方法
基于并集或指针算法的解决方案依赖于endianess,并且通常存在错误(指针别名冲突),因此应避免使用它们,因为使用它们没有任何好处。
input[i]&0xff
将为您提供第一个字节。如果你有超过2个字节,那么(input[i]>>8)&0xff
将隔离第二个字节,依此类推。谢谢你,我来试试。如果你想让所有字节都按顺序排列,你可以使用一个简单的循环,例如unsigned v=input[i],n=sizeof v;而(n--)printf(“0x%02x\n”,(v>>(n*8))&0xff)我不知道我是否应该这样说,但是,我不允许使用我没有学到的东西。因此,在移位8位之后,如何丢弃剩余的MSB 8位?(抱歉,有点不清楚)。通过移位(显然是移位8次),MSB 8位现在是LSB,MSB为零。现在,将此值移动到任意8位数据类型,这将丢弃MSB零,剩下的是您的值。
// 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,
};