格雷码及其逆的十进制等价物
格雷码或反射二进制码是一种二进制数字表示形式,其中两个连续数字仅相差一位。
例如,1 的格雷码为 001,而 2 的格雷码为 011。
格雷码通常用于纠错,因为它可以防止在状态改变时在通常的二进制表示中可能发生的一些数据错误。
由于其独特的属性,格雷码在 k 图、通信等方面也很有用。
先决条件
在继续阅读之前,请先学习十进制、二进制和格雷码符号。
问题陈述 1
给定一个十进制数 n,求出该数的十进制格雷码形式。
示例
输入:3 输出:2
解释 -> 3 的二进制表示形式为 011。其格雷码表示形式为 010。010 的十进制等价值为 2。
因此,3 的格雷码的十进制等价值为 2。
输入:5 输出:7
解释 -> 5 的二进制表示形式为 101。其格雷码表示形式为 111,其十进制等价形式为 7。
因此,5 的格雷码等价十进制形式为 7。
解决方案
编译器理解二进制格式的数字。
因此,在我们的程序中,当我们以十进制格式输入数字时,它将以二进制形式解释。
因此,我们只需要将数字从其二进制等价形式转换为其格雷码。
二进制到格雷码的转换
二进制表示形式和格雷码的最左边位相等。可以通过对连续二进制位进行异或来找到右侧的以下位。
例如 −
考虑 n = 3。3 的二进制码为 011。
二进制和格雷码的最左边位相等。因此,格雷码中从左边开始的第一位是 0。
对于从左边开始的第二位,对二进制码中从左边开始的第一位和第二位进行异或。0 XOR 1 = 1。
对于从左边开始的第三位,对二进制码中从左边开始的第二位和第三位进行异或。 1 XOR 1 = 0。
因此格雷码为:010。
算法:使用按位运算符
我们可以通过以下步骤获得数字 n 的格雷码 -
将 n 右移 1。
将右移后的数字与原始 n 进行异或。
示例
下面是一个使用按位运算符从二进制代码中查找格雷码的 C++ 程序
#include <bits/stdc++.h> using namespace std; //此函数返回 n 的格雷码的十进制等值 //。 int dec_equi_of_gray(int n) { return n ^ (n >> 1); } int main(){ int n = 3; cout<<"3 的格雷码的十进制等值是: "; //函数调用将二进制码转换为格雷码 cout << dec_equi_of_gray(n) << endl; return 0; }
输出
格雷码 3 的十进制等价值为:2
问题陈述 2
给定格雷码的十进制值,求其十进制码值。
示例
输入:15 输出:10
解释 ->输入的格雷码为:1111(二进制值为 15)。
现在,将格雷码转换为二进制码,从 1111 得到 1010。
1010 是 10 的二进制值。因此,输出为 1010。
输入:10 输出:12
解释 —— 输入的格雷码:1010(二进制值为 10)。
格雷码 1010 的二进制码为 1100。而 1100 的十进制为 12。
格雷码到二进制码的转换
二进制码的最左边位 (MSB) 与格雷码的 MSB 相同。可以通过对前一个索引二进制位和当前索引格雷位进行异或来找到以下位。
例如:考虑格雷码 1111。
二进制码的 MSB 将与格雷码的 MSB 相同。因此,MSB 将为 1。
对于第二个最左边的位,检查格雷码的第二个最左边的位和二进制码的最左边的位的异或。因此,1 ^ 1 = 0。
同样,对于第三个最左边的位,0 ^ 1 = 1。
对于第四个最左边的位,1 ^ 1 = 0。
因此二进制代码为:1010。
示例
以下是使用按位运算符从格雷码中查找二进制代码的 C++ 程序
#include <bits/stdc++.h> using namespace std; //该函数返回格雷码n转换成二进制码后的十进制值。 int gray_to_binary(int n){ int binary = n; while (n > 0){ n >>= 1; binary ^= n; } return binary; } // 驱动程序代码 int main(){ int n = 15; cout<<"格雷码转换为二进制码的十进制值为:"; // 函数调用将格雷码转换为二进制码 cout << gray_to_binary(n) << endl; return 0; }
输出
格雷码转换为二进制码的十进制值为:10
结论
本文解决了对于给定数字 n 求格雷码及其逆的十进制等价值的问题。我们使用按位运算符解决了这个问题。为问题的两个部分提供了 C++ 程序。