0

请看一下我的功能:

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;
}

在评论之前,一切都很好。也就是说,我从一个整数开始x,我只想取某个小节(由 指定n)。所以我所做的就是把除了我想保持为零的 8 位之外的所有东西都做完。例如,如果输入是:

 1001011 10011011 00101011 01001011

我只想保留第三组位(从右数),那么结果将是:

 00000000 10011011 00000000 00000000 

所以我成功地做到了这一点。问题是,我只需要返回我想要的位(将零裁剪为 a char)。尽管创建char result并返回它,但返回的仍然是 32 位值。

有什么帮助吗?谢谢!

明确一点:对于00000000 10011011 00000000 00000000,我只想 10011011退回。

谢谢!

4

2 回答 2

2

是的,它不是一个 8 位值,因为您的函数被声明为返回int,而不是 achar并且您返回的不是结果而是计算。此外,如果您不希望它在某处进行符号传播,请使用 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;
}
于 2012-10-13T02:02:56.077 回答
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;
}
于 2012-10-13T02:13:21.570 回答