mirror of
https://github.com/freeCodeCamp/freeCodeCamp.git
synced 2026-04-12 01:00:13 -04:00
123 lines
3.4 KiB
Markdown
123 lines
3.4 KiB
Markdown
---
|
||
id: 5a23c84252665b21eecc7e80
|
||
title: Код Грея
|
||
challengeType: 1
|
||
forumTopicId: 302276
|
||
dashedName: gray-code
|
||
---
|
||
|
||
# --description--
|
||
|
||
Код Грея — це форма бінарного програмування, де послідовні числа відрізняються лише одним бітом.
|
||
|
||
Таке програмування корисне для зменшення конфліктів апаратних даних зі значеннями, які швидко змінюються і/або підключаються до повільнішого обладнання як вхідні дані.
|
||
|
||
Воно також корисне для генерування вхідних даних для карт Карно в порядку зліва направо або зверху вниз.
|
||
|
||
# --instructions--
|
||
|
||
Створіть функцію, щоб зашифрувати число в код Грея та розшифрувати число з коду Грея. Функція повинна мати 2 параметри.
|
||
|
||
Перший параметр — булеве значення. Функція має зашифровувати, якщо true, та розшифровувати, якщо false. Другий параметр — число, яке потрібно зашифрувати/розшифрувати.
|
||
|
||
Відтворіть звичайні бінарні представлення, представлення коду Грея та розшифровані значення коду Грея для всіх 5-бітних бінарних чисел (від 0 до 31 включно, початкові нулі необов’язкові).
|
||
|
||
Існує багато можливих кодів Грея. Шифрування нижче називають «бінарним відображеним кодом Грея».
|
||
|
||
Шифрування (0 — найбільш значимий біт, b — бінарний, g — код Грея):
|
||
|
||
<pre>if b[i-1] = 1
|
||
g[i] = not b[i]
|
||
else
|
||
g[i] = b[i]
|
||
</pre>
|
||
|
||
Або:
|
||
|
||
<pre>g = b xor (b логічно зміщено праворуч 1 раз)
|
||
</pre>
|
||
|
||
Розшифрування (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;
|
||
}
|
||
}
|
||
```
|