Gray码生成
2016-04-06 23:24
489 查看
方法一:
(1) 1阶Gray码是 0, 1;
(2) 设n>1, 且n-1阶Gray码已定义好,
将n-1阶Gray码顺序列一遍, 接下来
将n-1阶Gray码反序列一遍,
顺序列的码每个前面添0,
反序列的码每个前面添1.
var
n,s,i,s1,k,j:longint;
a:array[0..1000] of longint;
procedure a10(x,dep:longint);
var
i:longint;
begin
if x<>0
then begin
a10(x div 2,dep+1);
write(x mod 2);
end;
if x=0
then begin
for i:=1 to n-dep+1 do
write(0);
end;
end;
begin
read(n);
a[1]:=0;
s:=1;
for i:=1 to n do
begin
s1:=s;
s:=s*2;
k:=s1;
for j:=s1 downto 1 do
begin
inc(k);
a[k]:=a[j]+s1;
end;
end;
for i:=1 to s do
begin
a10(a[i],1);
writeln;
end;
end.
方法2:
例如:二进制码0101,为4位数,所以其所转为之格雷码也必为4位数,因此可取转成之二进位码第五位为0,即0 b3 b2 b1 b0。
0 xor 0=0,所以g3=0
0 xor 1=1,所以g2=1
1 xor 0=1,所以g1=1
0 xor 1=1,所以g0=1
因此所转换为之格雷码为0111
var
a:array[0..10000] of longint;
s,i,n:longint;
procedure a10(x,dep:longint);
var
i:longint;
begin
if x<>0
then begin
a10(x div 2,dep+1);
write(x mod 2);
end;
if x=0
then begin
for i:=1 to n-dep+1 do
write(0);
end;
end;
procedure gray(x:longint);
var
s,x1,x2,i:longint;
begin
s:=0;
x1:=x;
a[x]:=0;
while x1<>0 do
begin
inc(s);
x1:=x1 div 2;
end;
for i:=1 to s do
begin
x1:=x and (1<<(i-1));
x1:=(x1<<(s-i))>>(s-1);
x2:=x and (1<<i);
x2:=(x2<<(s-i-1))>>(s-1);
a[x]:=a[x]+((x1 xor x2)<<(i-1));
end;
a10(a[x],1);
writeln;
end;
begin
read(n);
s:=1;
for i:=1 to n do
s:=s*2;
for i:=0 to s-1 do
gray(i);
end.
(1) 1阶Gray码是 0, 1;
(2) 设n>1, 且n-1阶Gray码已定义好,
将n-1阶Gray码顺序列一遍, 接下来
将n-1阶Gray码反序列一遍,
顺序列的码每个前面添0,
反序列的码每个前面添1.
var
n,s,i,s1,k,j:longint;
a:array[0..1000] of longint;
procedure a10(x,dep:longint);
var
i:longint;
begin
if x<>0
then begin
a10(x div 2,dep+1);
write(x mod 2);
end;
if x=0
then begin
for i:=1 to n-dep+1 do
write(0);
end;
end;
begin
read(n);
a[1]:=0;
s:=1;
for i:=1 to n do
begin
s1:=s;
s:=s*2;
k:=s1;
for j:=s1 downto 1 do
begin
inc(k);
a[k]:=a[j]+s1;
end;
end;
for i:=1 to s do
begin
a10(a[i],1);
writeln;
end;
end.
方法2:
例如:二进制码0101,为4位数,所以其所转为之格雷码也必为4位数,因此可取转成之二进位码第五位为0,即0 b3 b2 b1 b0。
0 xor 0=0,所以g3=0
0 xor 1=1,所以g2=1
1 xor 0=1,所以g1=1
0 xor 1=1,所以g0=1
因此所转换为之格雷码为0111
var
a:array[0..10000] of longint;
s,i,n:longint;
procedure a10(x,dep:longint);
var
i:longint;
begin
if x<>0
then begin
a10(x div 2,dep+1);
write(x mod 2);
end;
if x=0
then begin
for i:=1 to n-dep+1 do
write(0);
end;
end;
procedure gray(x:longint);
var
s,x1,x2,i:longint;
begin
s:=0;
x1:=x;
a[x]:=0;
while x1<>0 do
begin
inc(s);
x1:=x1 div 2;
end;
for i:=1 to s do
begin
x1:=x and (1<<(i-1));
x1:=(x1<<(s-i))>>(s-1);
x2:=x and (1<<i);
x2:=(x2<<(s-i-1))>>(s-1);
a[x]:=a[x]+((x1 xor x2)<<(i-1));
end;
a10(a[x],1);
writeln;
end;
begin
read(n);
s:=1;
for i:=1 to n do
s:=s*2;
for i:=0 to s-1 do
gray(i);
end.
相关文章推荐
- 书评:《算法之美( Algorithms to Live By )》
- 动易2006序列号破解算法公布
- Ruby实现的矩阵连乘算法
- C#插入法排序算法实例分析
- 超大数据量存储常用数据库分表分库算法总结
- C#数据结构与算法揭秘二
- C#冒泡法排序算法实例分析
- 算法练习之从String.indexOf的模拟实现开始
- C#算法之关于大牛生小牛的问题
- C#实现的算24点游戏算法实例分析
- c语言实现的带通配符匹配算法
- 浅析STL中的常用算法
- 算法之排列算法与组合算法详解
- C++实现一维向量旋转算法
- Ruby实现的合并排序算法
- C#折半插入排序算法实现方法
- 基于C++实现的各种内部排序算法汇总
- C++线性时间的排序算法分析
- C++实现汉诺塔算法经典实例
- PHP实现克鲁斯卡尔算法实例解析