千家信息网

C言语位运算

发表于:2025-02-23 作者:千家信息网编辑
千家信息网最后更新 2025年02月23日,所谓位运算,就是对一个比特(Bit)位停止操作。在《二进制思惟以及数据的存储》一节中讲到,比特(Bit)是一个电子元器件,8个比特组成一个字节(Byte),它曾经是粒度最小的可操作单位了。C言语供给了
千家信息网最后更新 2025年02月23日C言语位运算

所谓位运算,就是对一个比特(Bit)位停止操作。在《二进制思惟以及数据的存储》一节中讲到,比特(Bit)是一个电子元器件,8个比特组成一个字节(Byte),它曾经是粒度最小的可操作单位了。
C言语供给了六种位运算符:

运算符&|^~<<>>
阐明按位与按位或按位异或取反左移右移

按位与运算(&)

一个比特(Bit)位只要 0 和 1 两个取值,只要介入&运算的两个位都为 1 时,后果才为 1,不然为 0。例如1&1为 1,0&0为 0,1&0也为 0,这和逻辑运算符&&十分相似。
C言语中不克不及直接运用二进制,&双方的操作数可所以十进制、八进制、十六进制,它们在内存中最终多是以二进制方式存储,&就是对这些内存中的二进制位停止运算。其他的位运算符也是相反的事理。
例如,9 & 5可以转换成如下的运算:

0000 0000 -- 0000 0000 -- 0000 0000 -- 0000 1001 (9 在内存中的存储)
& 0000 0000 -- 0000 0000 -- 0000 0000 -- 0000 0101 (5 在内存中的存储)
-----------------------------------------------------------------------------------
0000 0000 -- 0000 0000 -- 0000 0000 -- 0000 0001 (1 在内存中的存储)

也就是说,按位与运算会对介入运算的两个数的一切二进制位停止&运算,9 & 5的后果为 1。
又如,-9 & 5可以转换成如下的运算:

1111 1111 -- 1111 1111 -- 1111 1111 -- 1111 0111 (-9 在内存中的存储)
& 0000 0000 -- 0000 0000 -- 0000 0000 -- 0000 0101 (5 在内存中的存储)
-----------------------------------------------------------------------------------
0000 0000 -- 0000 0000 -- 0000 0000 -- 0000 0101 (5 在内存中的存储)

-9 & 5的后果是 5。

关于负数和正数在内存中的存储方式,我们已在VIP教程《整数在内存中是若何存储的》中停止了解说。

再强调一遍,&是依据内存中的二进制位停止运算的,而不是数据的二进制方式;其他位运算符也一样。以-9&5为例,-9 的在内存中的存储和 -9 的二进制方式一模一样:

1111 1111 -- 1111 1111 -- 1111 1111 -- 1111 0111 (-9 在内存中的存储)
-0000 0000 -- 0000 0000 -- 0000 0000 -- 0000 1001 (-9 的二进制方式,后面过剩的 0 可以抹失落)


按位与运算平日用来对某些位清 0,或许保存某些位。例如要把 n 的高 16 位清 0 ,保存低 16 位,可以停止n & 0XFFFF运算(0XFFFF 在内存中的存储方式为 0000 0000 -- 0000 0000 -- 1111 1111 -- 1111 1111)。
【实例】对下面的剖析停止磨练。

                       #include  int main(){ int n = 0X8FA6002D; printf("%d, %d, %X\n", 9 & 5, -9 & 5, n & 0XFFFF); return 0; }

运转后果:
1, 5, 2D

按位或运算(|)

介入|运算的两个二进制位有一个为 1 时,后果就为 1,两个都为 0 时后果才为 0。例如1|1为1,0|0为0,1|0为1,这和逻辑运算中的||十分相似。
例如,9 | 5可以转换成如下的运算:

0000 0000 -- 0000 0000 -- 0000 0000 -- 0000 1001 (9 在内存中的存储)
| 0000 0000 -- 0000 0000 -- 0000 0000 -- 0000 0101 (5 在内存中的存储)
-----------------------------------------------------------------------------------
0000 0000 -- 0000 0000 -- 0000 0000 -- 0000 1101 (13 在内存中的存储)

9 | 5的后果为 13。
又如,-9 | 5可以转换成如下的运算:

1111 1111 -- 1111 1111 -- 1111 1111 -- 1111 0111 (-9 在内存中的存储)
| 0000 0000 -- 0000 0000 -- 0000 0000 -- 0000 0101 (5 在内存中的存储)
-----------------------------------------------------------------------------------
1111 1111 -- 1111 1111 -- 1111 1111 -- 1111 0111 (-9 在内存中的存储)

-9 | 5的后果是 -9。
按位或运算可以用来将某些地位 1,或许保存某些位。例如要把 n 的高 16 地位 1,保存低 16 位,可以停止n | 0XFFFF0000运算(0XFFFF0000 在内存中的存储方式为 1111 1111 -- 1111 1111 -- 0000 0000 -- 0000 0000)。
【实例】对下面的剖析停止校验。

                  #include  int main(){ int n = 0X2D; printf("%d, %d, %X\n", 9 | 5, -9 | 5, n | 0XFFFF0000); return 0; }

运转后果:
13, -9, FFFF002D

按位异或运算(^)

介入^运算两个二进制位分歧时,后果为 1,相反时后果为 0。例如0^1为1,0^0为0,1^1为0。
例如,9 | 5可以转换成如下的运算:

0000 0000 -- 0000 0000 -- 0000 0000 -- 0000 1001 (9 在内存中的存储)
^ 0000 0000 -- 0000 0000 -- 0000 0000 -- 0000 0101 (5 在内存中的存储)
-----------------------------------------------------------------------------------
0000 0000 -- 0000 0000 -- 0000 0000 -- 0000 1100 (12 在内存中的存储)

9 | 5的后果为 12。
又如,-9 | 5可以转换成如下的运算:

1111 1111 -- 1111 1111 -- 1111 1111 -- 1111 0111 (-9 在内存中的存储)
^ 0000 0000 -- 0000 0000 -- 0000 0000 -- 0000 0101 (5 在内存中的存储)
-----------------------------------------------------------------------------------
1111 1111 -- 1111 1111 -- 1111 1111 -- 1111 0010 (-1 在内存中的存储)

-9 | 5的后果是 -14。
按位异或运算可以用来将某些二进制位反转。例如要把 n 的高 16 位反转,保存低 16 位,可以停止n ^ 0XFFFF0000运算(0XFFFF0000 在内存中的存储方式为 1111 1111 -- 1111 1111 -- 0000 0000 -- 0000 0000)。
【实例】对下面的剖析停止校验。

                  #include  int main(){ unsigned n = 0X0A07002D; printf("%d, %d, %X\n", 9 ^ 5, -9 ^ 5, n ^ 0XFFFF0000); return 0; }

运转后果:
12, -14, F5F8002D

取反运算(~)

取反运算符~为单目运算符,右联合性,感化是对介入运算的二进制位取反。例如~1为0,~0为1,这和逻辑运算中的!十分相似。。
例如,~9可以转换为如下的运算:

~ 0000 0000 -- 0000 0000 -- 0000 0000 -- 0000 1001 (9 在内存中的存储)
-----------------------------------------------------------------------------------
1111 1111 -- 1111 1111 -- 1111 1111 -- 1111 0110 (-10 在内存中的存储)

所以~9的后果为 -10。
例如,~-9可以转换为如下的运算:

~ 1111 1111 -- 1111 1111 -- 1111 1111 -- 1111 0111 (-9 在内存中的存储)
-----------------------------------------------------------------------------------
0000 0000 -- 0000 0000 -- 0000 0000 -- 0000 1000 (9 在内存中的存储)

所以~-9的后果为 8。
【实例】对下面的剖析停止校验。

                   #include  int main(){ printf("%d, %d\n", ~9, ~-9 ); return 0; }

运转后果:
-10, 8

左移运算(<<)

左移运算符<<用来把操作数的各个二进制位全体左移若干位,高位丢弃,低位补0。
例如,9<<3可以转换为如下的运算:

<< 0000 0000 -- 0000 0000 -- 0000 0000 -- 0000 1001 (9 在内存中的存储)
-----------------------------------------------------------------------------------
0000 0000 -- 0000 0000 -- 0000 0000 -- 0100 1000 (72 在内存中的存储)

所以9<<3的后果为 72。
又如,(-9)<<3可以转换为如下的运算:

<< 1111 1111 -- 1111 1111 -- 1111 1111 -- 1111 0111 (-9 在内存中的存储)
-----------------------------------------------------------------------------------
1111 1111 -- 1111 1111 -- 1111 1111 -- 1011 1000 (-72 在内存中的存储)

所以(-9)<<3的后果为 -72
假如数据较小,被丢弃的高位不包括 1,那么左移 n 位相当于乘以 2 的 n 次方。
【实例】对下面的后果停止校验。

                   #include  int main(){ printf("%d, %d\n", 9<<3, (-9)<<3 ); return 0; }

运转后果:
72, -72

右移运算(>>)

右移运算符>>用来把操作数的各个二进制位全体右移若干位,低位丢弃,高位补 0 或 1。假如数据的最高位是 0,那么就补 0;假如最高位是 1,那么就补 1。
例如,9>>3可以转换为如下的运算:

>> 0000 0000 -- 0000 0000 -- 0000 0000 -- 0000 1001 (9 在内存中的存储)
-----------------------------------------------------------------------------------
0000 0000 -- 0000 0000 -- 0000 0000 -- 0000 0001 (1 在内存中的存储)

所以9>>3的后果为 1。
又如,(-9)>>3可以转换为如下的运算:

>> 1111 1111 -- 1111 1111 -- 1111 1111 -- 1111 0111 (-9 在内存中的存储)
-----------------------------------------------------------------------------------
1111 1111 -- 1111 1111 -- 1111 1111 -- 1111 1110 (-2 在内存中的存储)

所以(-9)>>3的后果为 -2
假如被丢弃的低位不包括 1,那么右移 n 位相当于除以 2 的 n 次方(但被移除的位中常常会包括 1)。
【实例】对下面的后果停止校验。

                 #include  int main(){ printf("%d, %d\n", 9>>3, (-9)>>3 ); return 0; }

运转后果:
1, -2


运算 内存 存储 后果 二进制 运算符 方式 两个 实例 面的 数据 剖析 相似 低位 操作数 逻辑 高位 言语 最高 全体 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 移动网络软件开发 吃鸡服务器选择 宿城区小型网络技术价目表 小米摄像机显示无法连接到服务器 漳州拓展互联网科技有限公司 如何查APP服务器的位置 请更换数据库所有者及口令 联想服务器 上海 我的世界联机进不了别人的服务器 软件开发大连沈阳 万方数据库文献检索的优点 直流屏软件开发 服务器只有一个盘而且是主分区 晋州市软件开发计算机培训学校 网络安全直播素材内容 车牌识别系统服务器密码 哪里可以查到高级报表数据库 虚拟服务器的好处 单位网络安全人员离岗制度 服务器风冷散热器需测试项目 电脑不小心变成网络安全模式 本地比服务器安全吗 大连商城软件开发定制 地下城新服务器什么时候上线 无锡hpe塑合型服务器价格 软件开发多长时间能学 请求php网站数据库 数据库用户分组表 网络安全论文250字 广州企业软件开发大概多少钱
0