格雷码及其逆的十进制等价


格雷码或反射二进制码是一种二进制数字表示形式,其中两个连续的数字仅一位不同。

例如,1 的格雷码是 001,而 2 的格雷码是 011。

格雷码通常用于错误校正,因为它可以防止在状态变化期间可能发生在普通二进制表示中的某些数据错误。

由于其独特的特性,格雷码在卡诺图、通信等方面也很有用。

先决条件

在继续阅读之前,请学习十进制、二进制和格雷码表示法。

问题陈述 1

给定一个十进制数 n,求该数的格雷码的十进制形式。

示例

Input: 3
Output: 2

解释 -> 3 的二进制表示为 011。其格雷码表示为 010。010 的十进制等价为 2。

因此,3 的格雷码的十进制等价为 2。

Input: 5
Output: 7

解释 -> 5 的二进制表示为 101。其格雷码表示为 111,其十进制等价为 7。

因此,5 的格雷码的十进制等价为 7。

解决方案

编译器以二进制格式理解数字。

因此,在我们的程序中,当我们以十进制格式输入一个数字时,它会被解释为二进制。

因此,我们只需要将一个数字从其二进制等价转换为其格雷码。

二进制到格雷码转换

二进制表示和格雷码的最左边的位是相等的。右侧的后续位可以通过取连续二进制位的异或来找到。

例如 -

考虑 n = 3。3 的二进制代码为 011。

  • 二进制和格雷码的最左边的位是相等的。因此,格雷码中最左边的一位是 0。

  • 对于从左边数起的第二位,对二进制代码中从左边数起的第 1 位和第 2 位进行异或运算。0 XOR 1 = 1。

  • 对于从左边数起的第三位,对二进制代码中从左边数起的第 2 位和第 3 位进行异或运算。1 XOR 1 = 0。

因此格雷码:010。

算法:使用按位运算符

我们可以通过以下步骤获得数字 n 的格雷码 -

  • 将 n 右移 1 位。

  • 将右移后的数字与原始 n 进行异或运算。

示例

下面是一个使用按位运算符从二进制代码查找格雷码的 C++ 程序

#include <bits/stdc++.h>
using namespace std;
//This function returns the decimal equivalent
// of the gray code of n.
int dec_equi_of_gray(int n) {
   return n ^ (n >> 1);
}
int main(){
   int n = 3;
   cout<<"The decimal equivalent of the gray code of 3 is: ";
   
   //Function call to convert binary code to gray code
   cout << dec_equi_of_gray(n) << endl;
   return 0;
}

输出

The decimal equivalent of the gray code of 3 is: 2

问题陈述 2

给定格雷码的十进制值,求其十进制代码值。

示例

Input: 15
Output: 10

解释 -> 给定作为输入的格雷码:1111(15 的二进制值)。

现在,将格雷码转换为二进制码得到 1010 从 1111。

而 1010 是 10 的二进制值。因此,输出。

Input: 10
Output: 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;

//This function returns the decimal value of 
//the binary code converted from the gray code n.
int gray_to_binary(int n){
   int binary = n;
   while (n > 0){
      n >>= 1;
      binary ^= n;
   }
   return binary;
}
// Driver Code
int main(){
   int n = 15;
   cout<<"The decimal value of the binary code converted from the gray code is: ";
   
   // Function call to convert gray code to binary code
   cout << gray_to_binary(n) << endl;
   
   return 0;
}

输出

The decimal value of the binary code converted from the gray code is: 10

结论

本文解决了针对给定数字 n 查找格雷码及其逆的十进制等价的问题。我们使用按位运算符解决了这个问题。为问题的两个部分都提供了 C++ 程序。

更新于: 2023 年 3 月 10 日

1K+ 次查看

开启您的 职业生涯

通过完成课程获得认证

立即开始
广告