C++青少年简明教程:二进制(binary)

C++青少年简明教程:二进制(binary)

计算机就像一个巨大的数字宝库,里面存放着很多数字。但是不同于我们平常使用的10个数字(0-9),计算机只使用两个数字来表示所有的信息,这两个数字分别是0和1。和我们平时使用的十进制不同,在计算机世界里,一切都是由0和1来表示的,这就是二进制系统。在二进制中,只有0和1两个数字。

数字"1"的编码为49。在Unicode编码中,数字"1"的编码为U+0031。存储表示用二进制表示形式为"00110001";在Unicode编码中,汉字"好"的编码为U+597D,它的存储表示二进制表示形式为"0101100101111101"【ASCII码只包含128个字符,不能包括中文字符,所以汉字"好"无法用ASCII码来表示】。图像等在计算机内部的表示方式也都是以二进制文件的形式进行存储及操作的。图像每个像素的颜色通常使用三个8位二进制数来表示,分别对应红色、绿色和蓝色(即 RGB 色彩空间)。例如,一个像素可能被编码为 11001010 10110111 00101100,表示该像素的红色,绿色和蓝色分量分别为 202,183和44。计算机类似这样使用0和1来区分所有的信息。

进行计算时,二进制的第一位代表的是2的0次方,即1;第二位代表的是2的1次方,即2;第三位代表的是2的2次方,即4;第四位代表的是2的3次方,即8;以此类推。

二进制数四则运算与十进制数类似,但它只使用了两个数字0和1。

逻辑运算是二进制计算中另一个重要的部分,常见的逻辑运算有与(AND)、或(OR)、非(NOT)和异或(XOR)。

C++语言中,二进制逻辑运算主要包括按位与(&)、按位或(|)、按位异或(^)和按位取反(~)四种运算。

在计算机存储和处理领域,字节单位常常有两种不同的表示方式:

一种表示方式是按照十进制次方进行计算,即1字节等于1000字节(10的3次方),1KB等于1000字节,1MB等于1000KB,依此类推。在一些非技术场景(如市场营销)使用。

一种表示方式是按照二进制次方进行计算,计算机内部的存储方式,即1字节等于1024字节(2的10次方),1KB等于1024字节,1MB等于1024KiB,依此类推。其中,K代表2的10次方,M代表2的20次方。

十进制数与二进制数转化

关于数制及其转换杂谈_二进制数能循环吗-CSDN博客

十进制转换成二进制

整数部分除二取余法,直到商为0为止;小数部分不断乘以2,每次得到的整数部分就是二进制数的每一位,直到小数部分为0或达到需要的精度为止。箭头代表书写顺序。

二进制转换成十进制

以小数点为界,拆分整数部分和纯小数部分转换。对于整数部分,从左到右依次乘以2的幂,并将结果相加;对于小数部分,从右到左依次乘以2的负幂,并将结果相加。参加下图:

二进制的理解是学习C++位运算符的基础。位运算符允许你直接对数据的位(bit)进行操作,这在处理低级系统编程、图形编程、网络编程、加密解密算法、优化内存使用等场景中非常有用。熟悉了二进制,就有了学习位运算符的基础。

在 C++ 中,位运算符用于对整数对应的二进制数的位(bit)进行操作。二进制逻辑运算符只能对整数类型进行操作,不能用于浮点数。【二进制逻辑运算符不适用于浮点数类型,因为浮点数类型的数据表示方式与整数类型不同。浮点数采用 IEEE 754 标准来表示,其中包含了符号位、指数位和尾数位,而不是简单的二进制位。】

按位与(&):对两个操作数的每个对应位执行逻辑与操作,只有当两个位都为1时,结果才为1。

按位或(|):对两个操作数的每个对应位执行逻辑或操作,只要有一个位为1,结果就为1。

按位异或(^):对两个操作数的每个对应位执行逻辑异或操作,当两个位不同时,结果为1。

按位取反(~):对操作数的每个位取反,即0变为1,1变为0。

左移(<<):将操作数的所有位向左移动指定的位数,右侧的空位用0填充。

右移(>>):将操作数的所有位向右移动指定的位数,左侧的空位用0或者符号位填充(取决于是无符号还是有符号数据类型)。

下面是示例:

#include <iostream>
using namespace std;

int main() {
    int a = 5; // 二进制表示为 0101
    int b = 3; // 二进制表示为 0011

    int result = a & b; // 按位与运算
    cout << "Bitwise AND: " << result << endl;

    result = a | b; // 按位或运算
    cout << "Bitwise OR: " << result << endl;

    result = a ^ b; // 按位异或运算
    cout << "Bitwise XOR: " << result << endl;

    result = ~a; // 按位取反运算
    cout << "Bitwise NOT: " << result << endl;

    result = a << 2; // 左移运算
    cout << "Bitwise Left Shift: " << result << endl;

    result = b >> 1; // 右移运算
    cout << "Bitwise Right Shift: " << result << endl;

    return 0;
}

输出结果:

Bitwise AND: 1
Bitwise OR: 7
Bitwise XOR: 6
Bitwise NOT: -6
Bitwise Left Shift: 20
Bitwise Right Shift: 1

右移(>>)运算符将操作数的所有位向右移动指定的位数。对于无符号数据类型,右移操作会在左侧用零填充空位;而对于有符号数据类型,右移操作会根据符号位进行填充。如果符号位为0,则在左侧用零填充空位;如果符号位为1,则在左侧用1填充空位。例如:

#include <iostream>
using namespace std;

int main() {
    int a = -8; // 二进制表示为 11111111111111111111111111111000

    int result = a >> 2; // 右移2位
    cout << "Right Shift: " << result << endl;

    unsigned int b = 8; // 二进制表示为 00000000000000000000000000001000

    unsigned int uResult = b >> 2; // 右移2位
    cout << "Right Shift: " << uResult << endl;

    return 0;
}

输出结果:

Right Shift: -2
Right Shift: 2

顺便提示,左移操作(<<)不论是无符号和有符号整数,将一个数左移n位相当于将这个数乘以2的n次方。如果左移的结果超出了整数类型的表示范围(即发生溢出),那么结果可能不是预期的。

对于无符号整数,右移操作(>>)确实相当于除以2的幂。具体来说,将一个数右移n位相当于将这个数除以2的n次方(忽略余数)。对于有符号整数类型,右移操作不完全等同于除以2的幂。

  • 15
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

学习&实践爱好者

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值