The gray code is a binary numeral system where two successive values differ in only one bit.
Given a non-negative integer n
representing the total number of bits in the code, find the sequence of gray code. A gray code sequence must begin with 0
and with cover all 2n integers.
Notice
For a given n
, a gray code sequence is not uniquely defined.
[0,2,3,1]
is also a valid gray code sequence according to the above definition.
Given n = 2
, return [0,1,3,2]
. Its gray code sequence is:
00 - 0
01 - 1
11 - 3
10 - 2
格雷码竟然忘记了。
Gray Code 0 = 0, 下一项是toggle最右边的bit(LSB), 再下一项是toggle最右边值为 “1” bit的左边一个bit。然后重复
如: 3bit
Gray Code: 000, 001, 011, 010, 110, 111, 101, 100, 最右边值为 “1” 的bit在最左边了,结束。
Binary : 000, 001, 010, 011, 100, 101, 110, 111
再者就是Binary Code 转换为Gray Code了。
如:
Binary Code :1011 要转换成Gray Code
1011 = 1(照写第一位), 1(第一位与第二位异或 1^0 = 1), 1(第二位异或第三位, 0^1=1), 0 (1^1 =0) = 1110
其实就等于 (1011 >> 1) ^ 1011 = 1110
/***
* 格雷码
* @param n
* @return
*/
public static ArrayList<Integer> grayCode(int n) {
int size = 1<<n;
ArrayList<Integer> ans = new ArrayList<Integer>(size);
for (int i = 0; i < size; i++) {
int gcode = i ^ ( i>>1 );
ans.add(gcode);
}
return ans;
}
其实,对于格雷码,书本上的思路为,转自 http://blog.csdn.net/sbitswc/article/details/20110655
比如n=3时
000
001
011
010
110
111
101
100
规律是 将格雷码看成是上下两部分 n=1
上 0 下 1
n=2
上为n=1时的格雷码
下为n=1时的格雷码的倒序再加上最前面的1
vector<int> grayCode(int n) {
vector<int> result;
result.push_back(0);
for(int i=0; i<n;i++){
int highest = 1<<i;
int len = result.size();
for(int i=len -1; i>=0; i--){
result.push_back(highest+result[i]);
}
}
return result;
}