首页 > 编程语言 >【C++编程题】格雷码与自然二进制码转换

【C++编程题】格雷码与自然二进制码转换

时间:2024-09-06 11:49:37浏览次数:7  
标签:bin 格雷 二进制码 cur int 编程 C++ 异或

        格雷码是数字信号处理中常用编码方式。格雷码中任意两个相邻代码的二进制位中只有一位不同,对于最大编码和最小编码也成立。

1.异或法转换

1.1 二进制码转格雷码

二进制码转格雷码 [1]

1)将二进制最高位{​{B}_{n-1}}保留;

2)对于二进制码中剩余的任意第 i 位,将其与第 i + 1 位异或得到当前的位; 

1.2 格雷码转二进制码

         

格雷码转二进制 [1]

1)将格雷码最高位{​{G}_{n-1}}保留;

2)将已经得到的第 i 位二进制码与第 i  - 1位格雷码异或,得到第 i - 1 位二进制码;

2. C++ 代码参考

vector<int> grayCode(int n) {
    int count = 1 << n;
    vector<int> res(count,0);
    for(int i = 1 ; i < count; i ++)
    {
        int bin = i,cur = bin >> (n - 1);
        for(int k = n - 1; k > 0; k --)
            cur = (cur << 1) + (((bin >> k) & 1) ^ ((bin >>(k - 1)) & 1));
        res[i] = cur;
    }
    return res;
}

 上述函数输入为格雷码的位数,输出为一个序列,包含所有 n 位格雷码的十进制数;

2.1 代码说明

1.int count = 1 << n;

此处将 1 左移 n 位,得到 n 位格雷码的个数,由于是从 0 开始计算,所以格雷码数量为${​{2}^{n}}-1$

 4.int bin = i,cur = bin >> (n - 1);

取出当前需要转换的二进制数 ,将其向右移动(n-1)位得到第 n 位。

6.cur = (cur << 1) + (((bin >> k) & 1) ^ ((bin >>(k - 1)) & 1));

从高位到低位依次与前一位进行异或操作。与 1 进行与操作的目的是将当前位置以外的数据位置零;

参考:格雷码与二进制的转换_格雷码转换为二进制码的方法-CSDN博客 

           Gray Code(格雷码) C++多方法实现_格雷码c++-CSDN博客

标签:bin,格雷,二进制码,cur,int,编程,C++,异或
From: https://blog.csdn.net/m0_65484315/article/details/141954673

相关文章

  • 《C++编程规范》五、类的设计与继承
    目录第32条弄清所要编写的是哪种类第32条弄清所要编写的是哪种类了解自我:有很多种不同的类。弄清楚要编写的是哪一种。不同种类的类适用于不同用途,因此遵循着不同的规则。值类(如std::pair,std::vector)模仿的是内置类型。一个值类应该:有一个公用析构函数、复制构造函......
  • 14 Python面向对象编程:反射
    本篇是Python系列教程第14篇,更多内容敬请访问我的Python合集在Python中,“反射”通常指的是根据字符串查找并执行相关的类、方法或者属性的能力。Python提供了几个内置函数和语法特性来支持这种能力,比如getattr(),setattr(),hasattr(),delattr()以及dir()等。这些功能......
  • 哪个编程工具让你的工作效率翻倍?
    哪个编程工具让你的工作效率翻倍?在日益繁忙的工作环境中,选择合适的编程工具已成为提升开发者工作效率的关键。不同的工具能够帮助我们简化代码编写、自动化任务、提升调试速度,甚至让团队协作更加顺畅。那么,哪款编程工具让你的工作效率翻倍?是智能的代码编辑器,强大的版本控制工......
  • Java高级编程—多线程(完整详解线程的三种实现方式、以及守护线程、出让线程、插入线程
    二十八.多线程文章目录二十八.多线程28.1线程的三种实现方式28.1.1第一种28.1.2第二种28.1.3第三种28.2常见的成员方法28.3守护线程28.4出让线程28.5插入线程28.6线程生命周期28.7同步代码块28.8同步方法28.1线程的三种实现方式继承Thread类的方式进行......
  • C++ STL map/multimap容器
    map/multimap容器Map的特性是,所有元素都会根据元素的键值自动排序。Map所有的元素都是pair,同时拥有实值和键值,pair的第一个元素被视为键值,第二个元素被视为实值,map不允许两个元素有相同的键值。multimap和map的操作类似,唯一区别是multimap的键值可以重复。注意:Map和multimap都......
  • C++(lambda)
    目录1.语法2.示例3.捕获方式4.可变性(mutable关键字)5.Lambda表达式的用途总结C++中的lambda表达式是一种匿名函数,通常用于简化代码,尤其是在处理临时或小型回调函数时。Lambda表达式引入于C++11,并在之后的C++标准中不断增强。它们可以捕获上下文中的变量,生成临时的函数对象......
  • 0906 shell编程与基础算法(leetCode)
    哈希表的基本知识:哈希表(HashTable)又称散列表,是除顺序存储结构、链式存储结构和索引表存储结构之外的又一种存储结构。哈希碰撞:解决办法开放定址法:是一类以发生冲突的哈希地址为自变量,通过某种哈希冲突函数得到一个新的空闲的哈希地址的方法。(1)线性探测法从发生冲突的地......
  • Python异步编程:asyncio库详解
    \asyncio是Python的标准库,用于编写单线程的并发代码。它使用async和await语法来定义和调用异步函数,使得I/O密集型程序能够更有效地使用资源。asyncio的主要特点事件循环:asyncio程序由事件循环驱动,它负责调度协程的执行。协程:使用async定义的异步函数被称为协程。任务:asyn......
  • 【C++】vector有关代码
     C++代码:#include<iostream>#include<vector>intmain(){//创建一个整数类型的vector并初始化std::vector<int>v={1,2,3};//使用迭代器遍历并打印vector中的每个元素for(autoi=v.begin();i!=v.end();++i){std::c......
  • C++ STL set/multiset容器
    set/multiset容器简介Set的特性是,所有元素都会根据元素的值自动被排序。Set不允许两个元素有相同的值。Set的迭代器iterator是一种const_iterator,不能通过迭代器改变任意set元素的值。multiset的特性和用法和set相同,唯一的差别在于它允许值重复。set和multiset的底层实现是红......