2021-06-15 07:49:18 +00:00
---
id: 5a23c84252665b21eecc7e80
2022-02-16 17:18:09 +00:00
title: Codice Gray
2021-06-15 07:49:18 +00:00
challengeType: 5
forumTopicId: 302276
dashedName: gray-code
---
# --description--
2022-02-16 17:18:09 +00:00
[Il codice Gray ](https://en.wikipedia.org/wiki/Gray code ) è una forma di codifica binaria in cui le transizioni tra numeri consecutivi differiscono di un solo bit.
2021-06-15 07:49:18 +00:00
2022-02-16 17:18:09 +00:00
Si tratta di una codifica utile per ridurre il rischio di perdita di dati hardware con valori che cambiano rapidamente e/o si collegano a un hardware più lento come input.
2021-06-15 07:49:18 +00:00
2022-02-16 17:18:09 +00:00
È utile anche per generare input per [mappe Karnaugh ](https://en.wikipedia.org/wiki/Karnaugh map ) in ordine da sinistra a destra o dall'alto al basso.
2021-06-15 07:49:18 +00:00
# --instructions--
2022-02-16 17:18:09 +00:00
Crea una funzione per codificare e decodificare un numero in codice Gray. La funzione dovrebbe avere 2 parametri.
2021-06-15 07:49:18 +00:00
2022-02-16 17:18:09 +00:00
Il primo sarà un booleano. La funzione dovrebbe codificare per true e decodificare per false. Il secondo paramentro sarebbe il numero da codificare/decodificare.
2021-06-15 07:49:18 +00:00
2022-02-16 17:18:09 +00:00
Mostra la rappresentazione binaria normale, la rappresentazione in codice Gray, e i valori in codice Gray decodificati per tutti i numeri binari di dimensione 5-bit (0-31 inclusivo, gli zero davanti al numero non sono necessari).
2021-06-15 07:49:18 +00:00
2022-02-16 17:18:09 +00:00
Ci sono molti possibili codici Gray. Il seguente codifica quello che è chiamato "codice Gray riflesso binario".
2021-06-15 07:49:18 +00:00
2022-02-16 17:18:09 +00:00
Codificare (MSB è bit 0, b è binario, g è codice Gray):
2021-06-15 07:49:18 +00:00
< pre > if b[i-1] = 1
g[i] = not b[i]
else
g[i] = b[i]
< / pre >
2022-02-16 17:18:09 +00:00
Oppure:
2021-06-15 07:49:18 +00:00
2022-02-16 17:18:09 +00:00
< pre > g = b xor (b logicamente spostato a destra 1 volta)
2021-06-15 07:49:18 +00:00
< / pre >
2022-02-16 17:18:09 +00:00
Decodificare (MSB è bit 0, b è binario, g è codice Gray):
2021-06-15 07:49:18 +00:00
< pre > b[0] = g[0]< br >
2022-02-16 17:18:09 +00:00
per altri bit:
2021-06-15 07:49:18 +00:00
b[i] = g[i] xor b[i-1]
< / pre >
# --hints--
2022-02-16 17:18:09 +00:00
`gray` dovrebbe essere una funzione.
2021-06-15 07:49:18 +00:00
```js
assert(typeof gray == 'function');
```
2022-02-16 17:18:09 +00:00
`gray(true,177)` dovrebbe restituire un numero.
2021-06-15 07:49:18 +00:00
```js
assert(typeof gray(true, 177) == 'number');
```
2022-02-16 17:18:09 +00:00
`gray(true,177)` dovrebbe restituire `233` .
2021-06-15 07:49:18 +00:00
```js
assert.equal(gray(true, 177), 233);
```
2022-02-16 17:18:09 +00:00
`gray(true,425)` dovrebbe restituire `381` .
2021-06-15 07:49:18 +00:00
```js
assert.equal(gray(true, 425), 381);
```
2022-02-16 17:18:09 +00:00
`gray(true,870)` dovrebbe restituire `725` .
2021-06-15 07:49:18 +00:00
```js
assert.equal(gray(true, 870), 725);
```
2022-02-16 17:18:09 +00:00
`gray(false,233)` dovrebbe restituire `177` .
2021-06-15 07:49:18 +00:00
```js
assert.equal(gray(false, 233), 177);
```
2022-02-16 17:18:09 +00:00
`gray(false,381)` dovrebbe restituire `425` .
2021-06-15 07:49:18 +00:00
```js
assert.equal(gray(false, 381), 425);
```
2022-02-16 17:18:09 +00:00
`gray(false,725)` dovrebbe restituire `870` .
2021-06-15 07:49:18 +00: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;
}
}
```