0
点赞
收藏
分享

微信扫一扫

【C&C++】二进制数据的位运算(如何存储字符)


目标:

字符变量用来存储字符一个字符占1个字节(8位),字符存储的其实是 ASCII 码表中所对应的整数,这些整数以 0-1 串来表示。】

输入一个字符,输出该字符在内存中存储时对应的 0-1

  • 1

例如:‘A’的 ASCII 码是65,对应的8位二进制 0-1 串是 01000001。

相关知识

通过位运算来获得一个字符对应的字节值(即8个位对应的 0-1 值)。首先介绍一下位运算的基本知识。

位运算

位运算允许在二进制位级别上对数据进行操作。C 和 C++ 支持 6 种不同的位运算符

【C&C++】二进制数据的位运算(如何存储字符)_c语言


按位与

两个操作数的按位与(&)是将两个操作数二进制表示的对应位进行与运算,即如果两个操作数的对应位都为1,则结果的对应位也为1,否则为0。(有0为0,同1为1

例如,3 & 14 结果为2,计算方法为:

3 的二进制表示: 00000011 
14 的二进制表示: 00001110
3 & 14 的二进制表示: 00000010

按位或
两个操作数的按位或(∣)是将两个操作数二进制表示的对应位进行或运算,即如果两个操作数的对应位都为0,则结果的对应位也为0,否则为1。(有1为1,全0为0

例如,3 | 14 结果为15,计算方法是:

3 的二进制表示: 00000011 
14 的二进制表示: 00001110
3 | 14 的二进制表示: 00001111

按位异或
两个操作数的按位异或(^)是将两个操作数二进制表示的对应位进行异或运算,即如果两个操作数的对应位不相同,则结果的对应位为1,相同则为0。(相异为1,相同为0

例如,3 ^ 14 结果为13,计算方法是:

3 的二进制表示: 00000011 
14 的二进制表示: 00001110
3 ^ 14 的二进制表示: 00001101

按位取反
按位取反(~)是将操作数二进制表示的对应位进行取反运算,即如果操作数的对应位为0,则结果的对应位为1,操作数为0,则结果对应位为0。(有1为0,有0为1)

例如,~14 结果为241,计算方法是:

14 的二进制表示: 00001110 
~ 14 的二进制表示: 11110001

向左移位
向左移位(<<)是将左操作数的二进制表示向左移位,移动的位数就是右操作数右操作数必须是非负值)的值,右端移出的空位填充0,移位后的左操作数的值即为运算的结果。

例如,3 << 2 结果为12,计算方法是:

3 的二进制表示: 00000011 
3 << 2 的二进制表示: 00001100

向右移位
向右移位(>>)是将左操作数的二进制表示向右移位,移动的位数就是右操作数的值,移位后的左操作数的值即为运算的结果。

左端移出的空位填充方式取决于左操作数的类型和具体的值:如果左操作数是无符号类型,或者是有符号类型但其值非负最高位为0),那么高位填充0;如果左操作数是有符号类型,并且为负数(最高位为1),高位填充的值取决于所用的计算机系统有的 C 和 C++ 系统实现填充0,有的填充1。

字符的二进制位的计算
有了上述位运算,我们就可以使用按位与运算判断一个字符的二进制表示(共8位)的某一位是1还是0。

例如下面的语句输出了字符变量 c 的二进制表示的第7位的值(c 的二进制表示有8位,从左到右分别为第 1 ~ 8 位):

cout << (int)(bool)(c & 0x02);


该语句输出表达式​​(int)(bool)(c & 0x02)​​​的值。该表达式有三个运算符:​​强制类型转换( int )​​​、​​强制类型转换( bool )​​​和​​按位与运算符 &​​。

因为括号的原因,表达式先计算​​c & 0x02​​​。​​0x02​​​ 是十六进制的​​02​​​,其二进制表示为 ​​00000010​​​ 。将 ​​c​​​ 和 ​​0x02​​​ 进行按位与,除了第7位外,不需要管 c 的其它位是什么,因为 ​​0x02​​​ 除了第7位,其它位都是0。那么就有,如果 c 的第7位如果是1,则按位与的结果就是 ​​00000010​​​,否则结果为 ​​00000000​​。

然后再进行两个类型转换运算,优先级相同,右结合,所以先计算​​(bool)(c & 0x02)​​​,即将计算结果转换为 bool 类型。如果​​c & 0x02​​​的值为 ​​00000000​​​,则结果为 ​​false​​​,否则结果为 ​​true​​​(即只要有一位不为0,则整个十六进制数转换后即为 ​​true​​​)。最后再把计算结果转换为 int 类型,即如果前面的计算结果是 ​​true​​,转换结果就是1,否则是0。

所以整个表达式的运算效果是:如果 c 的第7位为0,就输出0,第7位数为1则输出1。以此类推,我们就可以计算出 c 对应的二进制8位 0-1 串了。

编程要求:

实现输入一个字符,程序输出字符对应二进制 0-1 串。

程序实现:

// 包含两种I/O库,可以使用任一种输入输出方式
#include <stdio.h>
#include <iostream>
using namespace std;

int main()
{
char c; // c-存储输入的字符
cin >> c; // 输入字符
// 请在Begin-End之间添加代码,输出 c 的 8 位二进制表示
/********** Begin *********/
cout << (int)(bool)(c & 0x80)
<< (int)(bool)(c & 0x40)
<< (int)(bool)(c & 0x20)
<< (int)(bool)(c & 0x10)
<< (int)(bool)(c & 0x08)
<< (int)(bool)(c & 0x04)
<< (int)(bool)(c & 0x02)
<< (int)(bool)(c & 0x01)
<< endl;

<span >/********** End **********/</span>
<span >return</span> <span >0</span><span >;</span>

}


测试输入:4
预期输出:00110100

测试输入:A
预期输出:01000001

[说明:第一个测试用例的输入是字符 4,其 ASCII 码值为 52,所以二进制表示为 00110100。]


测试为:

【C&C++】二进制数据的位运算(如何存储字符)_c语言_02


​(int)(bool)(c & 0x01)​​用十六进制和输入字符通过与运算来判断第1位是0还是1;依次仅将8位二进制数的第2位,第3位等变为1然后转为十六进制,用​​(int)(bool)​​来判断并输出最终所得的数。


举报

相关推荐

0 条评论