當前位置:首頁 » 編程語言 » 四位格雷碼和十進制的轉換c語言
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

四位格雷碼和十進制的轉換c語言

發布時間: 2023-06-10 03:50:55

⑴ 格雷碼的轉換方法

這種方法基於格雷碼是反射碼的事實,利用遞歸的如下規則來構造: 1位格雷碼有兩個碼字 (n+1)位格雷碼中的前2n個碼字等於n位格雷碼的碼字,按順序書寫,加前綴0 (n+1)位格雷碼中的後2n個碼字等於n位格雷碼的碼字,按逆序書寫,加前綴1 n+1位格雷碼的集合 = n位格雷碼集合(順序)加前綴0 + n位格雷碼集合(逆序)加前綴1 2位格雷碼3位格雷碼4位格雷碼4位自然二進制碼00
01
11
10 000
001
011
010
110
111
101
100 0000
0001
0011
0010
0110
0111
0101
0100
1100
1101
1111
1110
1010
1011
1001
1000 0000
0001
0010
0011
0100
0101
0110
0111
1000
1001
1010
1011
1100
1101
1110
1111 二進制碼→格雷碼(編碼):
此方法從對應的n位二進制碼字中直接得到n位格雷碼碼字,步驟如下: 對n位二進制的碼字,從右到左,以0到n-1編號 如果二進制碼字的第i位和i+1位相同,則對應的格雷碼的第i位為0,否則為1(當i+1=n時,二進制碼字的第n位被認為是0,即第n-1位不變) 公式表示:(G:格雷碼,B:二進制碼) 例如:二進制碼0101,為4位數,所以其所轉為之格雷碼也必為4位數,因此可取轉成之二進位碼第五位為0,即0 b3 b2 b1 b0。
0 xor 0=0,所以g3=0
0 xor 1=1,所以g2=1
1 xor 0=1,所以g1=1
0 xor 1=1,所以g0=1
因此所轉換為之格雷碼為0111 格雷碼→二進制碼(解碼):
從左邊第二位起,將每位與左邊一位解碼後的值異或,作為該位解碼後的值(最左邊一位依然不變)。依次異或,直到最低位。依次異或轉換後的值(二進制數)就是格雷碼轉換後二進制碼的值。
公式表示:(G:格雷碼,B:二進制碼)
原碼:p[n:0];格雷碼:c[n:0](n∈N);編碼:c=G(p);解碼:p=F(c);
書寫時按從左向右標號依次減小,即MSB->LSB,編解碼也按此順序進行 舉例:
如果採集器器採到了格雷碼:1010
就要將它變為自然二進制:
0 與第四位 1 進行異或結果為 1
上面結果1與第三位0異或結果為 1
上面結果1與第二位1異或結果為 0
上面結果0與第一位0異或結果為 0
因此最終結果為:1100 這就是二進制碼即十進制 12
當然人看時只需對照表1一下子就知道是12 ...................c[n]=p[n],
解碼: 利用卡諾圖相鄰兩格只有一位變化以及卡諾圖的變數取值以低階格雷碼的順序排布的特徵,可以遞歸得到高階格雷碼。由於此方法相對繁瑣,使用較少。生成格雷碼的步驟如下: 將卡諾圖變數分為兩組,變數數目相近(最好相等) 以邏輯變數高位在左低位在右建立卡諾圖 從卡諾圖的左上角以之字形到右上角最後到左下角遍歷卡諾圖,依次經過格子的變數取值即為典型格雷碼的順序 三位格雷碼(三位格雷碼由建立在二位基礎上) AB╲ C 0 1 00 0→ 1↓ 01 ↓2 ←3 11 6→ 7↓ 10 4 ←5 格雷碼次序:000起點→001→011→010→110→111→101→100終點
四位格雷碼 AB╲CD 00 01 11 10 00 0→ 1→ 3→ 2↓ 01 ↓4 ←5 ←7 ←6 11 12→ 13→ 15→ 14↓ 10 8 ←9 ←11 ←10 格雷碼次序:0000起點→0001→0011→0010→0110→0111→0101→0100→1100→1101→
1111→1110→1010→1011→1001→1000終點 用異或代替加減進行二進制豎式乘除,稱為異或乘除,它的特點是無進退位。
如:10101除以11將變成1100餘1。
二進制轉格雷碼:
只要異或乘以二分之三,即二進制的1.1,然後忽略小數部分;也可以理解成異或乘以三(即11),再右移一位。
格雷碼轉二進制:
異或除以三分之二,即除以1.1,忽略余數;或者左移一位,再異或除以三,忽略余數。

⑵ 求救c語言編程!!!

#include <iostream.h>

void main()
{
cout<<"第一行對應的是十進制自然數"<<endl;
int a[16],gray_code[64]={0,0,0,0,0,0,0,1,0,0,1,1,0,0,1,0,0,1,1,0,0,1,1,1,0,1,0,1,0,1,0,0,1,1,0,0,1,1,0,1,1,1,1,1,1,1,1,0,1,0,1,0,1,0,1,1,1,0,0,1,1,0,0,0};
for(int i=0;i<16;i++)
{
a[i]=i;
cout<<a[i]<<" ";
}
cout<<endl;
cout<<"第二行是格雷碼"<<endl;
for(i=0;i<4;i++)
{
cout<<gray_code[i];
}
cout<<" ";
for(i=4;i<8;i++)
{
cout<<gray_code[i];
}
cout<<" ";
for(i=8;i<12;i++)
{
cout<<gray_code[i];
}
cout<<" ";
for(i=12;i<16;i++)
{
cout<<gray_code[i];
}
cout<<" ";
for(i=16;i<20;i++)
{
cout<<gray_code[i];
}
cout<<" ";
for(i=20;i<24;i++)
{
cout<<gray_code[i];
}
cout<<" ";
for(i=24;i<28;i++)
{
cout<<gray_code[i];
}
cout<<" ";
for(i=32;i<36;i++)
{
cout<<gray_code[i];
}
cout<<" ";
for(i=40;i<44;i++)
{
cout<<gray_code[i];
}
cout<<" ";
for(i=44;i<48;i++)
{
cout<<gray_code[i];
}
cout<<" ";
for(i=48;i<52;i++)
{
cout<<gray_code[i];
}
cout<<" ";
for(i=52;i<56;i++)
{
cout<<gray_code[i];
}
cout<<" ";
for(i=56;i<60;i++)
{
cout<<gray_code[i];
}
cout<<" ";
for(i=60;i<64;i++)
{
cout<<gray_code[i];
}
cout<<endl;
}
搞錯了,我是用C++來做的,C++跟C的分別就是那些輸入輸出不同而已.樓主自己改吧

⑶ c語言實現格雷碼轉換為二進制

把十進制小數乘以2,取其積的整數部分作對應二進制小數的最高位系數k -1 再取積的純小數部分乘以2,新得積的整數部分又作下一位的系數k -2 ,再取其積的純小數部分繼續乘2,…,直到乘積小數部分為0時停止,這時乘積的整數部分是二進制數最低位系數,每次乘積得到的整數序列就是所求的二進制小數。這種方法每次乘以基數取其整數作系數。所以叫乘基取整法。需要指出的是並不是所有十進制小數都能轉換成有限位的二進制小數並出現乘積的小數部分0的情況,有時整個換算過程無限進行下去。此時可以根據要求並考慮計算機字長,取定長度的位數後四捨五入這時得到的二進制數是原十進制數的近似值。

⑷ 如何將十進制轉換成格雷碼

轉換方法:
方法:
1、先將十進制轉成十六進制;

2、再將十六進制轉成格雷碼;
採用除基取余法

例如:十進制95轉格雷碼
95/16,商5,餘15,即十六進制數F

5/16,商0,餘5
從上到下依次是個位、十位
所以,最終結果為(5F)16。

⑸ 兩道C語言編程題題,求解!

(1)
#include <stdio.h>
void main(){
int i,j,n,K;
char s[100],x;
scanf("%d",&n);
for (j=0;j<n;j++){
scanf("%d\n",&K);
gets(s);
for (i=0;i<strlen(s);i++) {
x = s[i];
if ( (s[i] >= 'a') && (s[i] <= 'z') ) {
x = s[i]+K;
if (x > 'z') x = x - 26;
if (x < 'a') x = x + 26;
};
if ( (s[i] >= 'A') && (s[i] <= 'Z') ){
x = s[i]+K;
if (x > 'Z') x = x - 26;
if (x < 'A') x = x + 26;
}
printf("%c",x); };
printf("\n");
};
exit(0);
}

(2)
題意不清,是不是輸入數在0-15之間。也就是4bit數。否則什麼叫「最高位」?
只有4bit,也就是不必去做位運算,查表code[16][5]就可以了。
#include <stdio.h>
void main(){
int d;
char code[16][5]={"0000","0001","0011","0010","0110","0111",
"0101","0100","1100","1101","1111","1110",
"1010","1011","1001","1000"};
printf("input n\n");
scanf("%d",&d);
printf("%s",code[d]);
}