1

「グレーコードで連続」とはどういう意味ですか? 10 と 11 は 10 進法で連続しているということですが、「グレイコードで連続」とはどういう意味ですか? 私が知っているのは、グレイ コードが 2 つの連続する値が 1 ビットだけ異なる 2 進数システムであることだけです。

ここにオンラインの解決策がありますが、これを理解できません

private static int graycode(byte term1, byte term2) {  
  byte x = (byte)(term1^term2);  // why use XOR?
  int count = 0;  
  while(x!=0)  
  {  
    x = (byte)(x &(x-1));  // why use bitwise operator?
    count++;               // what is count?
  }  
  return count == 1;  
}  

1時間を費やして理解しようとしていますが、まだ手がかりがありません。

4

4 に答える 4

1

2 進数で「1」に等しいビット数を数える方法は、非常に直感的ではありません。

バイナリ演算の知識が必要です。「1」の後に 1 つ以上のゼロが続く 10 進数から 1 を引くとどうなるかから始めます。9 のシーケンスが得られ、その長さはゼロの数に等しくなります。

1000000 - 1 = 999999  

同様のことが 2 進数でも起こります。非負の 2 進数から 1 を引くと、最下位の '0' の数字はすべて '1' に置き換えられ、これらのゼロの直前の '1' は 0 に置き換えられます。これは、バイナリで借用が行われる方法に従います。例:

0101_0000_0001_0000 - 1 = 0101_0000_0000_1111
aaaa aaaa aaab cccc   ->  aaaa aaaa aaab cccc

表記:読みやすさを向上させるためにアンダースコアを付けています。文字 a の上に表示されるすべての数字は変更されません。文字 b の上に表示される数字 '1' は '0' に変更されます。また、文字 c の上に表示される数字 '0' は '1' に変更されます。

次のステップでは、2 つの数値 (X) と (X-1) でビット単位の AND 演算を実行します。上記の算術特性により、各反復で、数字から消える '1' 桁が 1 つだけあります (右から、つまり最下位ビットから)。

反復回数を数えることで、数 X に最初に存在した「1」ビットの数を知ることができます。変数 X がゼロに等しくなると、反復は停止します。

グレーコードに関する質問には、他の人がすでに回答しています。私の答えは、「ビットカウント」がどのように機能するかを説明するだけです(2つの値をXORした後)。

于 2016-02-29T02:54:01.957 に答える
1

これは、2 つの数値が正確に 1 ビット異なることを意味します。

したがって、解決策は 2 つの数値を xor することから始まります。xor 演算の結果は、オペランドのビットが異なる場合は 1 になり、そうでない場合は 0 になります。

したがって、xor の結果のビット数を数えて 1 と比較する必要があります。それが、ダウンロードした例の動作です。2 進数で 1 を数えるこの方法は、Brian Kernighan によるよく知られた方法です。状態x = (byte)(x & (x-1))は最上位の1ビットをゼロにリセットするビットマジック。他にもたくさんあります

または、1 ビットで可能な 8 バイトのテーブルを検索することもできます。

byte one_bit_bytes[] = { 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80 };
于 2016-02-29T02:11:47.690 に答える