2021-06-15 00:49:18 -07:00
---
id: 5a23c84252665b21eecc7e80
2021-08-09 17:35:35 +09:00
title: Código de Gray
2021-06-15 00:49:18 -07:00
challengeType: 5
forumTopicId: 302276
dashedName: gray-code
---
# --description--
2021-08-09 17:35:35 +09:00
O [Código de Gray ](https://en.wikipedia.org/wiki/Gray code ) é uma forma de codificação binária, onde as transições entre números consecutivos diferem apenas em um bit.
2021-06-15 00:49:18 -07:00
2021-08-09 17:35:35 +09:00
Esta é uma codificação útil para reduzir riscos de dados de hardware com valores que se alteram rapidamente e/ou estejam associados ao hardware mais lento como entradas.
2021-06-15 00:49:18 -07:00
2021-08-09 17:35:35 +09:00
Ele também é útil para gerar entradas para os [mapas de Karnaugh ](https://en.wikipedia.org/wiki/Karnaugh map ) em ordem, da esquerda para a direita ou de cima para baixo.
2021-06-15 00:49:18 -07:00
# --instructions--
2021-08-09 17:35:35 +09:00
Crie uma função para codificar um número e decodifique um número a partir do código de Gray. A função deve receber dois parâmetros.
2021-06-15 00:49:18 -07:00
2021-08-09 17:35:35 +09:00
O primeiro deve ser um booleano. A função deve codificar para true e decodificar para false. O segundo parâmetro seria o número a ser codificado/decodificado.
2021-06-15 00:49:18 -07:00
2021-08-09 17:35:35 +09:00
Exibir as representações binárias normais, as representações do código de Gray e valores do código de Gray decodificados para todos os números binários de 5 bits (0-31 inclusive, mas os 0s iniciais não são necessários).
2021-06-15 00:49:18 -07:00
2021-08-09 17:35:35 +09:00
Existem muitos códigos de Gray possíveis. A seguir, temos um que codifica o que é chamado de "código de Gray refletido em binário."
2021-06-15 00:49:18 -07:00
2021-08-09 17:35:35 +09:00
Codificação (o MSB - bit mais significativo - é o bit 0, b é binário e g é o código de Gray):
2021-06-15 00:49:18 -07:00
< pre > if b[i-1] = 1
g[i] = not b[i]
else
g[i] = b[i]
< / pre >
2021-08-09 17:35:35 +09:00
Ou:
2021-06-15 00:49:18 -07:00
2021-08-09 17:35:35 +09:00
< pre > g = b xor (b deslocado logicamente para a direita 1 vez)
2021-06-15 00:49:18 -07:00
< / pre >
2021-08-09 17:35:35 +09:00
Decodificação (o MSB - bit mais significativo - é o bit 0, b é binário e g é o código de Gray):
2021-06-15 00:49:18 -07:00
< pre > b[0] = g[0]< br >
2021-08-09 17:35:35 +09:00
para outros bits:
2021-06-15 00:49:18 -07:00
b[i] = g[i] xor b[i-1]
< / pre >
# --hints--
2021-08-09 17:35:35 +09:00
`gray` deve ser uma função.
2021-06-15 00:49:18 -07:00
```js
assert(typeof gray == 'function');
```
2021-08-09 17:35:35 +09:00
`gray(true,177)` deve retornar um número.
2021-06-15 00:49:18 -07:00
```js
assert(typeof gray(true, 177) == 'number');
```
2021-08-09 17:35:35 +09:00
`gray(true,177)` deve retornar `233` .
2021-06-15 00:49:18 -07:00
```js
assert.equal(gray(true, 177), 233);
```
2021-08-09 17:35:35 +09:00
`gray(true,425)` deve retornar `381` .
2021-06-15 00:49:18 -07:00
```js
assert.equal(gray(true, 425), 381);
```
2021-08-09 17:35:35 +09:00
`gray(true,870)` deve retornar `725` .
2021-06-15 00:49:18 -07:00
```js
assert.equal(gray(true, 870), 725);
```
2021-08-09 17:35:35 +09:00
`gray(false,233)` deve retornar `177` .
2021-06-15 00:49:18 -07:00
```js
assert.equal(gray(false, 233), 177);
```
2021-08-09 17:35:35 +09:00
`gray(false,381)` deve retornar `425` .
2021-06-15 00:49:18 -07:00
```js
assert.equal(gray(false, 381), 425);
```
2021-08-09 17:35:35 +09:00
`gray(false,725)` deve retornar `870` .
2021-06-15 00:49:18 -07:00
```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;
}
}
```