以下内容是看了Matrix67的关于二进制的blog(Link)的一点总结与摘录。

Gray码,中文“格雷码”,是一种特殊的编码,相邻两个格雷码的二进制表示中有且仅有一位不同,且 n 阶 Gray 码是 0~2^n-1 的一个排列。

n 阶 Gray  码可以由 n-1 阶 Gray 码镜像翻转之后最前面加一个 '1' 得到。

比如 2 阶 Gray 码为:

00

01

11

10

3 阶:

000

001

011

010

110

111

101

100

这样就巧妙的实现了相邻的数只有一个二进制位不同。

Gray 与 Hanoi 塔问题有着密切联系,第 i 个 n 阶格雷码改变的是第 x 位,相应的 n 个圆盘的 Hanoi 塔在这第 i 步就移动编号为 x 的盘子。

这样,只要能计算出第 i 个 n 阶格雷码是什么,就能知道第 i 步的 n 阶 Hanoi 的移动步骤是什么。

求出第 i 个 Gray 码非常简单 : Gray(i) = i xor (i shr 1)           [C++] Gray[i] = i ^ (i >> 1);

这个证明可以看 Matrix67 的blog。

有关 Gray码的题目一道:Link

题目大意:给定 n 与 m,要求输出一个 2^n 行, 2^m 列的矩阵,里面填 0~2^(n+m)-1 的所有数字,每个数字与它相邻的数字的二进制表示都有且仅有一位不同。

题目分析:这道题是求一个“二维”的格雷码,然而我们有一个简便的构造方法,就是每个数字的前 n 位是 n 阶格雷码,后 m 位是 m 阶格雷码。

行与行之间的前 n 位不同,列与列之间的后 m 位不同,这样,由“一维”格雷码就轻松构造出“二维”格雷码了~

代码如下:

 

#include <cstdio>

using namespace std;

int main()
{
int n, m;
scanf("%d%d", &n, &m);
int R, C, Num;
R = 1 << n; C = 1 << m;
for (int i = 0; i < R; ++i) {
Num = (i ^ (i >> 1)) << m;
for (int j = 0; j < C; ++j)
printf("%d ", Num | (j ^ (j >> 1)));
printf("\n");
}
return 0;
}

  

Gray码 (格雷码) 【二进制】的更多相关文章

  1. [LeetCode] Gray Code 格雷码

    The gray code is a binary numeral system where two successive values differ in only one bit. Given a ...

  2. Gray Code - 格雷码

    基本概念 格雷码是一种准权码,具有一种反射特性和循环特性的单步自补码,它的循环.单步特性消除了随机取数时出现重大误差的可能,它的反射.自补特性使得求反非常方便.格雷码属于可靠性编码,是一种错误最小化的 ...

  3. HDU 5375 Gray code 格雷码(水题)

    题意:给一个二进制数(包含3种符号:'0'  '1'  '?'  ,问号可随意 ),要求将其转成格雷码,给一个序列a,若转成的格雷码第i位为1,则得分+a[i].求填充问号使得得分最多. 思路:如果了 ...

  4. gray code 格雷码 递归

    格雷码 the n-1 bit code, with 0 prepended to each word, followd by the n-1 bit code in reverse order, w ...

  5. [LeetCode] 89. Gray Code 格雷码

    The gray code is a binary numeral system where two successive values differ in only one bit. Given a ...

  6. [LintCode] Gray Code 格雷码

    The gray code is a binary numeral system where two successive values differ in only one bit. Given a ...

  7. FPGA学习笔记之格雷码、边沿检测、门控时钟

    一.格雷码 格雷码的优点主要是进位时只有一位跳变,误码率低. 1.二进制转格雷码 我们观察下表: 二进制码 格雷码 00 00 01 01 10 11 11 10 二进制码表示为B[],格雷码表示为G ...

  8. LeetCode:Gray Code(格雷码)

    题目链接 The gray code is a binary numeral system where two successive values differ in only one bit. Gi ...

  9. 格雷码(Gray Code)转二进制码(Binary Code)

    学习verilog generate语句时,偶然看到用generate语句来进行格雷码到二进制码转换的代码,就从网上找了一些案例来学习. 下表为几种自然二进制码与格雷码的对照表: 十进制数 自然二进制 ...

随机推荐

  1. Sencha Touch 的基础知识

    基础知识 一.要注意书写,一个字母就会让你代码跑不起来Ext.setup({ icon:'icon.png', glossOnIcon:false, tabletStartupScreen:'talb ...

  2. SAE 上传根目录不存在!请尝试手动创建:./Uploads/Picture/

    请在Application\Common\Conf\config.php中,添加'FILE_UPLOAD_TYPE' => 'Sae'

  3. 《Linux Device Drivers》第十章 中断处理——note

    概述:系统要及时的感知硬件的状态,通常有两种方式:一种是轮询.一种是通过响应硬件中断.前者会浪费处理器的时间,而后者不会. 准备并口 在没有节设定产生中断之前,并口是不会产生中断的 并口的标准规定设置 ...

  4. 只有在配置文件中或 Page 说明会 enableSessionState 至 true 时刻,能够使用会话状态。另外,还要确保应用程序配置 // 段包含 System.Web.SessionSta

    首先,弄清楚我们的目的,我的目标是验证用户登录.那是,Session["userName"]!=null 在ok该 起初,我是这么写的,结果给出,提示如果上述错误标题,在调查的很长 ...

  5. InstallShield 12 制作安装包

    目  录 一. 二. 三. (一) 打开project... 2 (二) project助手页面... 3 1.Application Information:程序信息... 4 2.Installa ...

  6. Fragment的懒加载

    我们在做应用开发的时候,一个Activity里面可能会以viewpager(或其他容器)与多个Fragment来组合使用,而如果每个fragment都需要去加载数据,或从本地加载,或从网络加载,那么在 ...

  7. Jqure实现下拉多选

    Web ")                 {                     try                     {                          ...

  8. ssh框架简单搭建

    这里是个人对SSH框架搭建的一点心得,仅供新手,勿喷 首先,搞清楚分层, 视图层 --> 控制层  --> 业务层 --> DAO层--> 持久层 搭建的顺序是从后向前,搭建一 ...

  9. 在ec2上创建root用户,并使用root 通过Xshell远程登录aws云服务器

    1.根据官网提供的方法登录连接到EC2服务器(官网推荐windows用户使用PUTTY连接) 2. 创建root的密码,输入如下命令: sudo passwd root 3.然后会提示你输入new p ...

  10. 转载[POJ题型分类]

    北大ACM题分类 主流算法: 1.搜索 //回溯 2.DP(动态规划) 3.贪心 4.图论 //Dijkstra.最小生成树.网络流 5.数论 //解模线性方程 6.计算几何 //凸壳.同等安置矩形的 ...