请看一下我的功能:
int getByte(int x, int n) {
int oneOnes = 255 << ( n << 3);
int compute = oneOnes & x;
//FIND A WAY TO RETURN CHAR (NOT INT)
char result = (compute >> (n << 3));
return result;
}
在评论之前,Everthing很有效。也就是说,我从整数x
开始,我只想采用某个子部分(由n
指定)。所以我所做的就是将除了8位之外的所有内容都保留为零。例如,如果输入是:
1001011 10011011 00101011 01001011
我想只保留第3组比特(从右边算起),结果将是:
00000000 10011011 00000000 00000000
所以我设法正确地做到了。问题是,我需要只返回 我想要的位(将零裁剪为char
)。尽管创建了char result
并返回了它,但返回的内容仍然是32位值。
有任何帮助吗?谢谢!
要明确:对于00000000 10011011 00000000 00000000
,我只想要 10011011
。
谢谢!
答案 0 :(得分:2)
是的,它不是一个8位的值,因为你的函数被声明为返回int
而不是char
而你返回的不是结果而是计算。此外,如果您希望不在某处使用unsigned char作为结果类型进行符号传播:
unsigned char getByte(int x, int n) {
int oneOnes = 255 << ( n << 3);
int compute = oneOnes & x;
//FIND A WAY TO RETURN CHAR (NOT INT)
unsigned char result = (compute >> (n << 3));
return result;
}
但是这个实现效率更高:
unsigned getByte(int x, int n) {
return (x >> (n << 3)) & 0xFF;
}
答案 1 :(得分:1)
基本问题是你试图使用有符号整数来做这个,但是有符号整数的移位没有明确定义 - 只要位模式恰好是负值,就会发生坏事。
相反,通常在进行位操作时,您需要使用无符号整数:
unsigned int getByte(unsigned int x, unsigned int n) {
unsigned int oneOnes = 255U << ( n << 3);
unsigned int compute = oneOnes & x;
return (compute >> (n << 3));
}
如果您在移位后进行遮罩,则更容易,因为您不需要移动遮罩:
unsigned int getByte(unsigned int x, unsigned int n) {
return (x >> (n << 3)) & 255U;
}