#include<stdio.h>
#include<string.h>
unsigned char odd(char data)//奇校验
{
int i, cnt = 0;
for (i = 0; i < 7; i++)
{//一个char型有7位
int temp = ((data >> i) & 1);//data >> i是向右移i个位置得到的值,((data >> i) & 1)是与1不同的个数
cnt += temp;//cnt记录二进制下data中1的个数
}
unsigned char ans = data << 1;//左移1位
if (cnt % 2 == 0)//当cnt能够被2整除,即cnt是偶数,即1的个数是偶数
{
ans += 1;//在最右边加1
}
else//当cnt不能够被2整除,即cnt是奇数,即1的个数是奇数
{
ans += 0;//在最右边加0
}
return ans;
}
char itoc(int sum, int n)//可以把2、8、10进制转换成字符
{
int ans = 0;
int a[10] = { 0 };
int k = 0;
while (sum)//把sum的值从右向左依次输入到数组a[k]中
{
a[k++] = sum % 10;
sum /= 10;
}
int i;
for (i = k - 1; i >= 0; i--) //从有数字的右端,从右向左遍历数组a[k]
{
ans *= n;
ans += a[i];
}
return (char)ans;
}
int main()
{
char a = 0;
unsigned char b;
int flag = 0;
printf("请输入你想要的进制输入方式(2:2进制输入,8:8进制输入,10:10进制输入,16:16进制输入):");
scanf("%d", &flag);
printf("请输入校验码:");
int cnt = 0;
switch (flag)
{
case 2:
case 8:
case 10:
scanf("%d", &cnt);
a = itoc(cnt, flag);//调用itoc函数,把10进制转换成对应的字符
break;
case 16:
scanf("%x", &cnt);
a = (char)cnt;
break;
default:
break;
}
b = odd(a);
printf("2进制结果表示为:");//输出b的2进制表示
int i=0;
for (i = 7; i >= 0; i--)
{
if (((b >> i) & 1) == 1)
printf("1");
else
printf("0");
}
putchar(10);
printf("8进制结果表示为:%o\n", b);//输出b的8进制表示
printf("10进制结果表示为:%d\n", b);//输出b的10进制表示
printf("16进制结果表示为:%x\n", b);//输出b的16进制表示
return 0;
}
在VS2019下,将scanf改成scanf_s:
#include<stdio.h>
#include<string.h>
unsigned char odd(char data)//奇校验
{
int i, cnt = 0;
for (i = 0; i < 7; i++)
{//一个char型有7位
int temp = ((data >> i) & 1);//data >> i是向右移i个位置得到的值,((data >> i) & 1)是与1不同的个数
cnt += temp;//cnt记录二进制下data中1的个数
}
unsigned char ans = data << 1;//左移1位
if (cnt % 2 == 0)//当cnt能够被2整除,即cnt是偶数,即1的个数是偶数
{
ans += 1;//在最右边加1
}
else//当cnt不能够被2整除,即cnt是奇数,即1的个数是奇数
{
ans += 0;//在最右边加0
}
return ans;
}
char itoc(int sum, int n)//可以把2、8、10进制转换成字符
{
int ans = 0;
int a[10] = { 0 };
int k = 0;
while (sum)//把sum的值从右向左依次输入到数组a[k]中
{
a[k++] = sum % 10;
sum /= 10;
}
int i;
for (i = k - 1; i >= 0; i--) //从有数字的右端,从右向左遍历数组a[k]
{
ans *= n;
ans += a[i];
}
return (char)ans;
}
int main()
{
char a = 0;
unsigned char b;
int flag = 0;
printf("请输入你想要的进制输入方式(2:2进制输入,8:8进制输入,10:10进制输入,16:16进制输入):");
scanf_s("%d", &flag);
printf("请输入校验码:");
int cnt = 0;
switch (flag)
{
case 2:
case 8:
case 10:
scanf_s("%d", &cnt);
a = itoc(cnt, flag);//调用itoc函数,把10进制转换成对应的字符
break;
case 16:
scanf_s("%x", &cnt);
a = (char)cnt;
break;
default:
break;
}
b = odd(a);
printf("2进制结果表示为:");//输出b的2进制表示
int i = 0;
for (i = 7; i >= 0; i--)
{
if (((b >> i) & 1) == 1)
printf("1");
else
printf("0");
}
putchar(10);
printf("8进制结果表示为:%o\n", b);//输出b的8进制表示
printf("10进制结果表示为:%d\n", b);//输出b的10进制表示
printf("16进制结果表示为:%x\n", b);//输出b的16进制表示
return 0;
}