位运算符
位运算符主要以二进制规则进行运算并且按位运算符是把操作数看作一系列单独的位,而不是一个数字值。
所以我们解释一下什么是 “位” :
数值或字符在内存内都是被存储为0和1的序列,每个0和1被称之为1个位,比如说10进制数据2在计算机内被存储为 0 0 0 0 0 0 1 0(此处以一字节为例),当我们将内存内的位值改变之后,这个值代表的意义也就变了,比如把2前移动一位, 现在存储单元里面变成了0 0 0 0 0 1 0 0,这个值表示的是十进制的4,这也就是按位操作符的运算原理。
1. & -- 按位与
&& -- 逻辑与 (也叫并且)
&与&& 的含义完全不同
对与运算符的应用代码
运行思路
5 的二进制表示为 0101
7 的二进制表示为 0111
5 和 7 进行相与为 0101
相与可以看做真和真、真和假、假和假
真和真即为真 (1 &1 = 1)
真和假即为假 (1 & 0 = 0 或 0 & 1 =0)
假和假即为假 (0 & 0 = 0)
代码运行结果
5 与 7 相与之后为 0101 转换为十进制即为 5,所以输出结果为5;(k = j && i)因为&&为逻辑运算符所以只能表示真或假,非零即真则输出 1 。
思考
如果将 i = 5 改为 i = 21,输出结果将会是什么?
答案: 5
2. | -- 按位或
|| 逻辑或
| 按位或
对按位或运算符的应用代码
运行思路
3 的二进制表示为 0011
5 的二进制表示为 0101
3 和5 按位或后为 0111
结果即为 7
注: 1 | 1 = 1
1 | 0 = 1
0 | 0 = 0
运行结果
3. ~ -- 按位取反
~ i 表示将 i 变量所有的二进制代码取反
对其应用代码如下:
运行思路
3的二进制补码为00000011
补码取反后的表示 1111 1100看补码最高位为 1 ,所以取反后为负数。
再将取反后的补码转换为原码得到10000100(-4)。
运行结果
4. ^ -- 按位异或
异或 : 相同为零,不同为一。
1 ^ 1 = 0 1 ^ 0 = 1 0 ^ 0 = 0
简单应用
运行思路
运行结果
如何不设置第三个变量交换两个数的值?
异或操作找出二进制不相同的位数,然后各自取反。
5. << -- 按位左移
i << 1 表示把 i 的所有二进制位左移一位
在这里我们可以思考十进制,十进制左移一位为乘10(例123 左移一位后补零即为1230),右移一位为除以10;
同理二进制,二进制左移一位为乘2,右移一位为除以2,当左移n位时相当于乘2的n次方。
简单应用
运行结果
小知识
k = i * 8 与 i << 3 两个语句作用相同,运行速度哪一个更快?
答:i << 3 更快。
6. >> -- 按位右移
i >> 3 表示把 i 的所有二进制位移右三位,左边一般补零,当然也可能补一(这里较为复杂,就不多做介绍)。
当右移n位时相当于除以2的n次方,前提是数据不能够丢失。
拓展知识
条件运算符( 表达式1?表达式2 :表达式3 )
执行操作:如果表达式1正确,则执行表达式2;
如果表达式1错误,则执行表达式3。
C语言常用该运算符比较大小。
总结
位运算符的现实意义:通过位运算符我们可以将数据的操作精确到每一位 。