Files

123 lines
3.4 KiB
Markdown
Raw Permalink Normal View History

---
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;
}
}
```