千家信息网

C言语位运算

发表于:2026-10-31 作者:千家信息网编辑
千家信息网最后更新 2026年10月31日,所谓位运算,就是对一个比特(Bit)位停止操作。在《二进制思惟以及数据的存储》一节中讲到,比特(Bit)是一个电子元器件,8个比特组成一个字节(Byte),它曾经是粒度最小的可操作单位了。C言语供给了
千家信息网最后更新 2026年10月31日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安全错误 数据库的锁怎样保障安全 耶加雪菲 南京欣网互联网络科技 亿人帮互联网科技有限公司 互联网最新的科技有限公司 壕鑫互联网络科技 兼蜜互联网科技 互联网科技股午盘股票涨跌 海南科技产业互联网平台 科技赋能互联网健康 玖二柒互联网科技公司待遇 小米互联网科技园设置 受益于互联网科技的高速发展 洛阳昕诺飞互联网科技有限公司 科技类公司包括互联网吗 保险科技服务互联网营销体系 广州千川互联网科技有限公司 中天科技中国工业互联网 福建互联网展示科技馆设计 数字互联网科技有限公司 高科技和互联网的现代国家 南京欣网互联网络科技有限公司 美国互联网科技 互联网教育科技公司vipkid 成都互联网科技公司100强 互联网科技公司有风险吗 电子商务与互联网科技的关系 山东大美朱楼互联网科技有限公司 互联网时代科技型公司的机会 米泉互联网科技专业怎么样 互联网金融金融科技
0