3.1 KiB
id, title, challengeType, forumTopicId, dashedName
id | title | challengeType | forumTopicId | dashedName |
---|---|---|---|---|
5a23c84252665b21eecc7e80 | グレイコード | 5 | 302276 | gray-code |
--description--
[グレイコード](https://en.wikipedia.org/wiki/Gray code)はバイナリエンコーディングの一形態で、連続する数値の変化が 1 ビットのみとなっています。
これは、急速に変化する値を持つ場合や入力時に動作の遅いハードウェアに接続する場合に、ハードウェアのデータハザードを減少させるのに役立つエンコーディングです。
また、 [カルノー図](https://en.wikipedia.org/wiki/Karnaugh map) への入力を左から右へ、または上から下へと順に生成するのにも便利です。
--instructions--
数値をグレイコードにエンコードし、グレイコードから数値にデコードする関数を作成してください。 この関数は 2 つのパラメーターを取得する必要があります。
1つ目はブール値です。 この関数は true の場合にエンコードし、false の場合にデコードします。 2 つ目のパラメータはエンコード/デコードされる数値です。
すべての 5 ビット 2 進数 (0-31 を含む、最初の 0 は省略可) の通常のバイナリ表現、グレイコード表現、およびグレイコードからデコードされた値を表示します。
グレイコードには様々な方法があります。 以下は、「交番二進グレイコード」と呼ばれるエンコードです。
エンコーディング (最上位ビットはビット 0、b はバイナリ、g はグレイコード):
if b[i-1] = 1 g[i] = not b[i] else g[i] = b[i]
または:
g = b xor (b を論理的に 1 回右シフト)
デコーディング (最上位ビットはビット 0、b はバイナリ、g はグレイコード):
b[0] = g[0]
for other bits: b[i] = g[i] xor b[i-1]
--hints--
gray
は関数とします。
assert(typeof gray == 'function');
gray(true,177)
は数値を返す必要があります。
assert(typeof gray(true, 177) == 'number');
gray(true,177)
は233
を返す必要があります。
assert.equal(gray(true, 177), 233);
gray(true,425)
は381
を返す必要があります。
assert.equal(gray(true, 425), 381);
gray(true,870)
は725
を返す必要があります。
assert.equal(gray(true, 870), 725);
gray(false,233)
は177
を返す必要があります。
assert.equal(gray(false, 233), 177);
gray(false,381)
は425
を返す必要があります。
assert.equal(gray(false, 381), 425);
gray(false,725)
は870
を返す必要があります。
assert.equal(gray(false, 725), 870);
--seed--
--seed-contents--
function gray(enc, number) {
}
--solutions--
function gray(enc, number){
if(enc){
return number ^ (number >> 1);
}else{
let n = number;
while (number >>= 1) {
n ^= number;
}
return n;
}
}