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

そして、3 番目のビット グループ (右から数えて) のみを保持したい場合、結果は次のようになります。

 00000000 10011011 00000000 00000000 

だから私はそれを正しく行うことができました。問題は、必要なビットのみを返す必要があることです (ゼロをトリミングして、 としてchar)。を作成してchar resultそれを返しても、返されるのは 32 ビット値のままです。

何か助けはありますか?ありがとう!

明確にするために: については、返品のみ00000000 10011011 00000000 00000000を希望しています。 10011011

ありがとう!

4

2 に答える 2

2

intはい、関数はa ではなくを返すように宣言されてcharおり、結果ではなく計算を返すため、8 ビット値ではありません。また、どこかに符号伝播させたくない場合は、結果の型として 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 に答える