格雷码题目讲解(C++版)

  • 格雷码简介
  • 经典例题
    •   题目展示
    •   题目讲解
    •   代码解题

  小白在这胡说八道,有不足的地方欢迎大佬们斧正ˋ( ° ▽、° )

格雷码简介

详解见百度百科,这里只敲重点浅谈几个方面

  1. 优点:自然二进制码可以直接由数模转换器转换成模拟信号,但在某些情况,例如从十进制的3转换为4时二进制码的每一位都要变,能使数字电路产生很大的尖峰电流脉冲。而格雷码则没有这一缺点,它在相邻位间转换时,只有一位产生变化,大大地减少了由一个状态到下一个状态时逻辑的混淆。
  2. 核心:按规律的异或方法将格雷码转换成二进制,直到最低位
  3. 应用:智力玩具九连环、现代半导体工艺里的位元转换(低功耗)、刻度标尺定位系统(检测位置信息)

经典例题

  题目展示

LeetCode - 使整数变为 0 的最少操作次数(题目编号:1611)
level: Hard
Subject:
  给你一个整数 n(0 <= n <= 109),你需要重复执行多次下述操作将其转换为 0

  1. 翻转 n 的二进制表示中最右侧位(第 0 位)
  2. 如果第 (i-1) 位为 1 且从第 (i-2) 位到第 0 位都为 0,则翻转 n 的二进制表示中的第 i 位。

返回将 n 转换为 0 的最小操作次数

Example 1:
输入:n = 3
输出:2
解释:3 的二进制表示为 “11”
“11” -> “01” ,执行的是第 2 种操作,因为第 0 位为 1
“01” -> “00” ,执行的是第 1 种操作

Example 2:
输入:n = 6
输出:4
解释:6 的二进制表示为 “110”.
“110” -> “010” ,执行的是第 2 种操作,因为第 1 位为 1 ,第 0 到 0 位为 0
“010” -> “011” ,执行的是第 1 种操作
“011” -> “001” ,执行的是第 2 种操作,因为第 0 位为 1
“001” -> “000” ,执行的是第 1 种操作

  题目讲解

  仔细观看题目需要执行的操作,发现本质上就是典型格雷码的枚举规则,我们可以翻译题目需求为 “格雷码需要向0方向枚多少次才变成0,即解码成0”,本文讲解的运算规则有枚举、编码、解码

  • 枚举 - 格雷码从小变大遵循的规则
    1.第一步改变最右边的位元(1变0,0变1)
    2.第二步改变右起第一个为1的位元的左边位元(1变0,0变1)
    3.如此反复第一步、第二步

  • 枚举 - 格雷码从大变小遵循的规则
    1.第一步改变最右边的位元(1变0,0变1)
    2.第二步改变右起第一个为1的位元的左边位元(1变0,0变1)
    3.如此反复第一步、第二步
  • 编码 - 二进制转格雷码
    原理:如果二进制码字的第 i 位和 i+1 位(从右边开始数)相同,则对应的格雷码的第i位为0,否则为1(当i+1=n时,二进制码字的第n位被认为是0,即第n-1位不变)

/*编码模板 */
#include <iostream>
using namespace std;int gray_encode(int num)
{return num ^ (num >> 1);     // >>是位移运算符,^是异或运算符
}
  • 解码 - 格雷码转换成二进制
    原理:从左边第二位起,将每位与左边一位解码后的值进行异或,作为该位解码后的值(最左边一位依然不变),直到最低位。

/*解码模板 */
#include<math.h>      // log对数函数需要用到的头文件
#include <iostream>
using namespace std;int gray_decode(int num)
{int head;if(!num) return 0;head = 1 << int(log(num) / log(2));  //C++没有直接以2为底的对数,我们创造一个以2为底的对数return head + gray_decode((num^head) ^ (head>>1));
}

  代码解题

按上面的模板来说,第一种是直接套用“解码”的模板

/* 第一种模板 */
#include<math.h>      // log对数函数需要用到的头文件
#include <iostream>
using namespace std;int gray_decode(int num)
{int head;if(!num) return 0;head = 1 << int(log(num) / log(2));return head + gray_decode((num^head) ^ (head>>1));
}int main()
{int n = 0;cin >> n;gray_decode(n);
}

第二种是较简洁的模板(注解待完善)

/* 第二种模板 */
#include <iostream>
#include <cmath>
using namespace std;int minimumOneBitOperations(int n) {int result = 0;while(n){result ^= n;n >>= 1;        }return result;
}int main()
{int n = 0;cin >> n;minimumOneBitOperations(n);
}

路漫漫其修远兮,吾将上下而求索

格雷码(从零基础讲解,C++版)相关推荐

  1. Java零基础笔记自用版(一)

    系列文章目录 一.Java零基础笔记自用版(一) 目录 系列文章目录 前言 一.⭐️Java概述 二.⭐️变量 三.⭐️运算符 四.⭐️控制结构 五.⭐️数组.排序.查找 写在最后 前言 最近在学习J ...

  2. 使用PyTorch构建GAN生成对抗网络源码(详细步骤讲解+注释版)02 人脸识别 上

    文章目录 1 数据集描述 2 GPU设置 3 设置Dataset类 4 设置辨别器类 5 辅助函数与辅助类 1 数据集描述 此项目使用的是著名的celebA(CelebFaces Attribute) ...

  3. 使用PyTorch构建GAN生成对抗网络源码(详细步骤讲解+注释版)02 人脸识别 下

    文章目录 1 测试鉴别器 2 建立生成器 3 测试生成器 4 训练生成器 5 使用生成器 6 内存查看 上一节,我们已经建立好了模型所必需的鉴别器类与Dataset类. 使用PyTorch构建GAN生 ...

  4. 使用PyTorch构建卷积GAN源码(详细步骤讲解+注释版) 02人脸图片生成 上

    阅读提示:本篇文章的代码为在普通GAN代码上实现人脸图片生成的修改,文章内容仅包含修改内容,全部代码讲解需结合下面的文章阅读. 相关资料链接为:使用PyTorch构建GAN生成对抗 本次训练代码使用了 ...

  5. 3DMAX零基础建模字幕版教程

    3DMAX零基础建模,3dmax零基础到精通,3DMAX建模,新手零基础到精通游戏建模"3D建模"游戏建模,全流程讲解 3DMAX零基础建模,3dmax零基础到精通,3DMAX建模 ...

  6. javascript实例自学手册光盘源码_零基础,自学编程,如何选择语言?

    零基础,又要自学,如何选择一门适合自己的语言是所有踏上这条路的朋友都会遇到的第一个问题.之前,看了不少文章,说的或多或少都有道理,比如会从你将来学编程的目的入手,分析需要用什么然后学什么,有些从语言的 ...

  7. 使用PyTorch构建GAN生成对抗网络源码(详细步骤讲解+注释版)01 手写字体识别

    文章目录 1 生成对抗网络基本概念 2 生成对抗网络建模 2.1 建立MnistDataset类 2.2 建立鉴别器 2.3 测试鉴别器 2.4 Mnist生成器制作 3 模型的训练 4 模型表现的判 ...

  8. DockerCompose从零基础讲解到玩转它!

    一.Docker Compose 1.有什么用 比如我们要部署一个javaweb应用,那一般情况都需要三个容器:nginx容器.tomcat容器.mysql容器.这是最基本的,可能更复杂.那运维人员每 ...

  9. 格雷码基础和生成的几种方法

    1 格雷码: 1.1 格雷码引言: 在数字系统中,常要求代码按一定顺序变化. 在机器视觉里面,编码结构光也是按照一定的顺序进行变化,最常用的就是Binary,但是,二进制的纯粹的编码,由于二进制的进制 ...

最新文章

  1. SAS EG第一课练习1
  2. C# WebAPI中DateTime类型字段在使用微软自带的方法转json格式后默认含T的解决办法...
  3. CSS基础(part4)--CSS的层叠性继承性优先级
  4. Solr的安装和使用
  5. python dict.fromkeys()研究
  6. 深港澳大湾区第三次.NET技术交流会圆满成功
  7. VS2010断点设置技巧
  8. 用PHP做一道单选选择题的页面,【大神看过来】根据一个用PHP做的单选投票,改成多选,且可显示...
  9. Hyperledger Fabric学习笔记(四)- fabric单机部署 solo 版
  10. 通过asp.net 短信猫发短信
  11. android控件的touch事件_Android touch 事件分发时序
  12. BugFree在Windows Server 2003+IIS 6+MySQL的配置
  13. MyBatis使用foreach批量插入一个含List<实体>成员变量的实体类
  14. linux系统移植步骤
  15. 瑞友天翼服务器ip地址怎么修改,(瑞友天翼安装教程.doc
  16. bbed修改表记录内容系列三
  17. 利用Opencv+Qt打开摄像头
  18. 可以挂机赚钱的游戏有哪些?
  19. 企业邮箱服务该怎么选择?
  20. 【高项】范围管理(ITTO)

热门文章

  1. zb如何导出自己画的_ZBrush中如何导出效果图?
  2. postgresql 修改表结构 alter table xxx alter column yyy type varchar(19)
  3. 螺旋测微器b类不确定度_物理实验直测量不确定度评估.ppt
  4. macbook 更换固态出现问题记录
  5. 压敏电阻的工作原理,结构,分类与应用场总结
  6. 船舶航速优化文献阅读
  7. 在微信如何备份、导出自己和朋友的聊天记录?
  8. mahout基于hadoop的CF代码分析
  9. 吃鸡用什么蓝牙耳机?高性价比的游戏蓝牙耳机推荐
  10. python二郎成长笔记(一)(pip升级,python入门,基础,python2和3不同格式带来的问题,头文件引用的格式,变量的类型,__name__ == '__main__')