123 lines
3.4 KiB
Markdown
123 lines
3.4 KiB
Markdown
![]() |
---
|
|||
|
id: 5a23c84252665b21eecc7e80
|
|||
|
title: Код Грея
|
|||
|
challengeType: 5
|
|||
|
forumTopicId: 302276
|
|||
|
dashedName: gray-code
|
|||
|
---
|
|||
|
|
|||
|
# --description--
|
|||
|
|
|||
|
[ код Грея ](https://en.wikipedia.org/wiki/Gray code) - це форма бінарного кодування, де переходи між послідовними числами відрізняються лише на один біт.
|
|||
|
|
|||
|
Це корисне кодування для зменшення ризиків настання небезпеки для апаратних даних зі значеннями, що швидко змінюються та/або підключаються до повільнішого апаратного забезпечення як вхідних даних.
|
|||
|
|
|||
|
Це також корисно для генерації даних для [Karnaugh maps](https://en.wikipedia.org/wiki/Karnaugh map) у порядку зліва направо або зверху вниз.
|
|||
|
|
|||
|
# --instructions--
|
|||
|
|
|||
|
Створіть функцію для кодування номера та декодування номера з коду Грея. Функція повинна мати 2 параметри.
|
|||
|
|
|||
|
Перший - це логічний тип даних. Функція має кодувати true і декодувати false. Другим параметром буде число, яке потрібно закодувати/декодувати.
|
|||
|
|
|||
|
Поккажіть нормальні бінарні значення, значення коду Грея, і декодування даних коду Грея для всіх 5-бінарних чисел (0-31 включно, провідні нулі не є необхідними).
|
|||
|
|
|||
|
Існує багато можливих кодів Грея. Наступні кодування називаються "двійковим відображувальним кодом Грея."
|
|||
|
|
|||
|
Кодування (MSB є бітом 0, b є бінарним, g - кодом Грея):
|
|||
|
|
|||
|
<pre>якщо b [i-1] = 1
|
|||
|
g [i] = не b [i]
|
|||
|
інакше
|
|||
|
g [i] = b [i]
|
|||
|
</pre>
|
|||
|
|
|||
|
Або:
|
|||
|
|
|||
|
<pre>g = b xor (b логічно зміщено праворуч 1 раз)
|
|||
|
</pre>
|
|||
|
|
|||
|
Декодування (MSB є бітом 0, b є бінарним, g - кодом Грея):
|
|||
|
|
|||
|
<pre>b[0] = g[0]<br>
|
|||
|
для інших бітів:
|
|||
|
b[i] = g[i] xor b[i-1]
|
|||
|
</pre>
|
|||
|
|
|||
|
# --hints--
|
|||
|
|
|||
|
`gray` має бути функцією.
|
|||
|
|
|||
|
```js
|
|||
|
assert(typeof gray == 'function');
|
|||
|
```
|
|||
|
|
|||
|
`gray(true,177)` має повернути число.
|
|||
|
|
|||
|
```js
|
|||
|
assert(typeof gray(true, 177) == 'number');
|
|||
|
```
|
|||
|
|
|||
|
`gray(true,177)` має повернути `233`.
|
|||
|
|
|||
|
```js
|
|||
|
assert.equal(gray(true, 177), 233);
|
|||
|
```
|
|||
|
|
|||
|
`gray(true,425)` має повернути `381`.
|
|||
|
|
|||
|
```js
|
|||
|
assert.equal(gray(true, 425), 381);
|
|||
|
```
|
|||
|
|
|||
|
`gray(true,870)` має повернути `725`.
|
|||
|
|
|||
|
```js
|
|||
|
assert.equal(gray(true, 870), 725);
|
|||
|
```
|
|||
|
|
|||
|
`gray(false,233)` має повернути `177`.
|
|||
|
|
|||
|
```js
|
|||
|
assert.equal(gray(false, 233), 177);
|
|||
|
```
|
|||
|
|
|||
|
`gray(false,381)` має повернути `425`.
|
|||
|
|
|||
|
```js
|
|||
|
assert.equal(gray(false, 381), 425);
|
|||
|
```
|
|||
|
|
|||
|
`gray(false,725)`має повернути `870`.
|
|||
|
|
|||
|
```js
|
|||
|
assert.equal(gray(false, 725), 870);
|
|||
|
```
|
|||
|
|
|||
|
# --seed--
|
|||
|
|
|||
|
## --seed-contents--
|
|||
|
|
|||
|
```js
|
|||
|
function gray(enc, number) {
|
|||
|
|
|||
|
}
|
|||
|
```
|
|||
|
|
|||
|
# --solutions--
|
|||
|
|
|||
|
```js
|
|||
|
function gray(enc, number){
|
|||
|
if(enc){
|
|||
|
return number ^ (number >> 1);
|
|||
|
}else{
|
|||
|
let n = number;
|
|||
|
|
|||
|
while (number >>= 1) {
|
|||
|
n ^= number;
|
|||
|
}
|
|||
|
return n;
|
|||
|
}
|
|||
|
}
|
|||
|
```
|