1

そこで、7 ビットのグレイ コードを対応する 7 ビットのバイナリ コードに変換する関数を作成しようとしています。

変換方法は次のとおりです-

  • グレー値ビット ---- MS ビット > (G6) G5 G4 G3 G2 G1 G0 *
  • バイナリ値ビット -- MS ビット > (B6) B5 B4 B3 B2 B1 B0 *

  • B6 = G6 // MS ビットは常に同じ

  • B5 = B6 ^ G5 // ビットを排他的「OR」して、7 ビットのバイナリ値を構築します
  • B4 = B5 ^ G4
  • B3 = B4 ^ G3
  • B2 = B3 ^ G2
  • B1 = B2 ^ G1
  • B0 = B1 ^ G0

これまでの私の機能は次のとおりです-

unsigned short Gray_to_Bin(unsigned short Gray)
{
unsigned short Bin;
unsigned short i;
unsigned short mask;

mask = 0x40; // Initial mask
Bin = 0;

Gray &= 0x7f; // Mask bit 7 (Index Bit)
Bin = Gray & mask; // Set B6 = G6

for (i=0; i<6; i++) // Set B5, B4, ..., B0
{

// Code needed here!!

}
return Bin;
}

ループの実行ごとに必要な特定のビットにアクセスする方法を見つける必要があります...どうにかして配列でできるようにビットにアクセスする必要があります...

アイデア/ポインタはありますか?ありがとう :)

4

7 に答える 7

2

以下は、指定した要件に従って、結果のビットごとのアセンブリを実装します。

  • B6 = G6 // MS ビットは常に同じ
  • B5 = B6 ^ G5
  • ...

B5 の場合は、B6 の値を 1 ビット右にビットシフトして、グレー ビット G5 に対応させ、XOR 演算を行ってから、演算で他のビットを除外します&。これらのビット単位の結果は OR 演算されて、全体的な結果が作成されます。連続するビットに対して繰り返します。このためのループを持つ価値さえありません...余分な実行時のオーバーヘッドとソースコードの複雑さだけです。

unsigned short gray_to_binary(unsigned short gray)
{
    unsigned short result = gray & 64;
    result |= (gray ^ (result >> 1)) & 32;
    result |= (gray ^ (result >> 1)) & 16;
    result |= (gray ^ (result >> 1)) & 8;
    result |= (gray ^ (result >> 1)) & 4;
    result |= (gray ^ (result >> 1)) & 2;
    result |= (gray ^ (result >> 1)) & 1;
    return result;
}
于 2011-03-15T08:31:32.773 に答える
2

グレーを binay に変換するためのより最適化されたコードは次のようになります。

int grayToBinary(int gray)
{
int binary=0;
for(;gray;gray=gray>>1)
{
    binary^=gray; //binary=binary^gray;
}
return binary;
}

この手法では、ビットごとの演算子を使用します。

于 2020-05-23T17:34:47.173 に答える
1

私が知っているグレーコードをバイナリコードに変換する最速の方法は、次の Java メソッドを実装することです。

private static int grayToBin(int gray) {
   int bin = 0;
   while (gray != 0) {
      int decremented = gray - 1;
      bin ^= gray;
      bin ^= decremented;
      gray &= decremented;
   }
   return bin;
}
于 2019-12-27T13:24:08.263 に答える
0

次のコードでうまくいくはずです。

for (int i = 0; i < 6; ++ i) {
    unsigned short j = 5 - i;
    unsigned short m = 1 << j;
    Bin |= ((Bin >> 1) & m) ^ (Gray & m);
}
于 2011-03-15T08:26:34.133 に答える
0

ある 7 ビット コードを別のコードに変換する場合、最も簡単な解決策は単なるテーブルです。たとえば、次のようになります。 、0x0F、0x0E、0x0A、0x0B、0x09、0x08、0x18、0x18、0x1B、0x1A、0x1E、0x1F、0x1D、0x1C、0x14、0x15、0x17、0x16、0x12、0x13、0x10、// . };

8 ビットから 16 ビットの間のある時点で、おそらくアルゴリズム アプローチに移行することをお勧めします (ただし、最新のプロセッサで利用可能なメモリを考えると、テーブル アプローチはかなり大きなテーブルに有効です)。それでも、下位ビットにはテーブルを使用するでしょう。

于 2011-03-15T08:49:50.097 に答える
0

私はそれが次のように見えるべきだと思います:

for(i=5; i >= 0; i--){
    Bin = Bin | ((Gray & 1<<i)>>i ^ (Bin & 1<<(i + 1))>>i)<<i;
}

特定のビットにアクセスするには、1<<i「1」を i 回左にシフトし、右から i 番目の 1 を除いてすべてゼロの数値を生成します。これは、Gray または Bin と AND 演算して、重要なビットを除くすべてのビットをゼロにすることができます。結果は を使用して右にシフト>>iされ、重要なビットが右端に移動されます。^ を使用して 2 つのビットを xor し、結果のビットが属する場所に左にシフトし、OR を int Bin にします。

これは非常に有益な説明を提供します。

于 2011-03-15T08:31:12.837 に答える
0

what is the problem with just what you wrote in your question i mean in you for statement you can write B[i] = B[i+1]^G[i]; you just have to change your for so it goes from 4 downto zero

于 2011-03-15T08:11:53.167 に答える