格雷码(Gray Code)是一个数列集合,每个数使用二进位来表示,假设使用n位元来表示每个数字,任两个数之间只有一个位元值不同。
例如以下为3位元的格雷码: 000 001 011 010 110 111 101 100 。
如果要产生n位元的格雷码,那么格雷码的个数为2^n.
十进制 | 葛雷码 | 二进制 |
---|---|---|
0 | 000 | 000 |
1 | 001 | 001 |
2 | 011 | 010 |
3 | 010 | 011 |
4 | 110 | 100 |
5 | 111 | 101 |
6 | 101 | 110 |
7 | 100 | 111 |
二进制数转格雷码
(假设以二进制为0的值做为格雷码的0)
G:格雷码 B:二进制码
G(N) = (B(n)/2) XOR B(n)
vector<int> GrayCreate(int n){
//产生n位的格雷码序列
vector<int> ans;
ans.clear();
for (int i = 0; i < (1<<n); i++) {
ans.push_back(i ^ (i >> 1));
}
return ans;
}
格雷码转二进制数
二进制码第n位 = 二进制码第(n+1)位+格雷码第n位。因为二进制码和格雷码皆有相同位数,所以二进制码可从最高位的左边位元取0,以进行计算。(注:遇到1+1时结果视为0)
例如: 格雷码0111,为4位数,所以其所转为之二进制码也必为4位数,因此可取转成之二进制码第五位为0,即0 b3 b2 b1 b0。
0+0=0,所以b3=0
0+1=1,所以b2=1
1+1取0,所以b1=0
0+1取1,所以b0=1
因此所转换为之二进制码为0101