/*
本小程序通过自定义函数形式,实现汉字字符与二进制字符串的互转。程序涉及的基础知识包括位的左右移运算、位的或与运算等。通过编写或研习此小程序可以巩固C++基础知识。
程序代码及详细注释见下:
*/
#include<iostream>
using namespace std;
#include<bitset>
//二进制字符串转char类型字符
char StrToChar(char str[])
//说明:汉字由两个8位字节组成,调用本函数时一个字节调用一次(即一次只输入8为字符),返回的char字符连在一起显示
{
char chr = 0;
for (int i = 0; i < 8; ++i)
//
{
chr = (chr << 1) | (str[i] - '0');
/*
上面这个语句是该子程序的核心语句。从运算优先级上看"chr<<1"本可以不加括号,因为其优先于与运算符"|",这里加上括号是为了看起来更加明显。
先看右边的括号(str[i] - '0'),从参数str各位的取值范围只有"1"或"0"两个字符。字符"1"
的ASCII值是49(dec) 0011 0001(bin),字符"0"的ASCII值是48(dec) 0011 0000 (bin)。每一次循环,如str某位等于'1'减'0'后,结果用二进制表示就是 0000 0001、如等于'0'结果就是 0000 0000。
再看左边的括号(chr << 1),是左移运算;每循环一次就将chr的每个二进制位向左移动1位,最左边的一位被挤出去,最右边空出来的一位补0。如1010 0101<<1变成0100 1010。
两个括号间的是或运算符"|",将左移运算后的结果与右边括号的结果按位做或运算;通过8次循环,就将由0或1组成8位的字符串转换成二进制的8位字符。
*/
}
return chr;
}
//单个汉字转二进制形式的字符串
char* CharToStr(char * chr)
//说明:输入的汉字为单个汉字,返回的二进制字符串长度为16
{
char* Str = new char[16];
int k = 0;
for (int i = 0; i<2; i++)
{
for (int j = 7; j >=0; j--)
{
if ((chr[i] >> j & 1) == 1)
//这里的原理同上边相同,类似逆运算,不过多解释
{
Str[k] = '1';
}
else
{
Str[k] = '0';
}
k++;
}
}
return Str;
delete[] Str;
}
int main()
{
//下面是“你”字的的前后8位二进制字符串作为参数调用StrToChr
char str1[] = "11000100";
char str2[] = "11100011";
char chr1 = StrToChar(str1);
char chr2 = StrToChar(str2);
printf("%c%c", chr1, chr2); //将返回值显示
cout << "\n========================================="<<endl;
//下面再把“你”字作为参数调用CharToStr
char chr[] = "你";
char* str = CharToStr(chr);
for (int i = 0; i < 16; i++)
{
printf("%c",str[i]);
if (i == 7||i==16)printf("\n");
}
system("pause");
return 0;
}