
11.1.2 位运算符简介
不难猜测,位运算符肯定是针对位进行运算的。上面说了位的概念,现在就要讲一讲位的运算了,看表11.1,其中列出了位运算符及它们的含义。
表11.1 位运算符及其含义

表11.1中位运算符一共有6个,除了“~”(取反)运算符之外,其他都是二目运算符,也就是运算符的左侧和右侧各有一个运算分量,而“~”是单目运算符,该运算符只有右侧有一个运算量。下面逐一介绍这些运算符。
1.按位与运算符“&”
参加运算的两个运算量,如果两者相应的位都为1,则该位的结果为1,否则为0(与逻辑运算符“&&”有点类似,逻辑运算符“&&”是参加运算的两个运算分量都为真,则结果为真,有一个为假则结果为假)。看公式:

看看如下范例:

上面的范例结果为6,重要问题是该结果是如何计算出来的,要转成二进制数进行计算才比较方便观察和学习。38&22等价于如下:

看看计算步骤,注意看计算时需要右对齐,左侧不够的位都补0:

然后上面的每一位数字和下面对应位的数字按照上述公式来进行按位与运算,结果为:

上面“=”代表两侧值相等,本章后面涉及“=”时,如果不特别说明都代表相等关系。
2.按位或运算符“|”
参加运算的两个运算量,如果两者相应的位有一个为1,则该位的结果为1,否则为0(与逻辑运算符“||”有点类似,逻辑运算符“||”是参加运算的两个运算分量都为假,则结果为假,有一个为真则结果为真)。看公式:

看看如下范例:

看看计算步骤:

3.按位异或运算符“^”
参加运算的两个运算量,如果两者相应的位相同,则结果为0,否则结果为1,总结一下:都一样出0,不一样出1。看公式:

看看如下范例:

看看计算步骤:

请想一想,如果某个数字的某些二进制位想翻转(从0变成1,从1变成0),那这个位可以和1做异或运算,如果某些二进制位想保持不变,那这个位可以和0做异或运算。例如,有个二进制数01111010,希望它的低4位翻转,高4位保持不变,那么可以像如下这样来进行按位做异或运算:

4.取反运算符“~”
取反运算符是单目运算符,只有一个运算量,用来对一个数字进行按位取反,也就是0变成1,1变成0。
看看如下范例:

看看计算步骤:

5.左移运算符“≪”
将一个数的二进制位左移若干位,右侧补0,每左移一位都相当于把原来的数字乘以2。
看看如下范例:

看看计算步骤:

再看一例:

看看计算步骤:

6.右移运算符“≫”
将一个数的二进制位右移若干位,超出最低位的被舍弃,左侧高位补0,每右移一位都相当于除以2。
看看如下范例:

看看计算步骤:

再看一例:

看看计算步骤:

说明:位运算符和赋值运算符可以结合使用。例如:

请注意一些规律,“=”总是在右侧,这些结合起来的运算符其实就是复合赋值运算符(前面章节讲解过),如a&=b等价于a=a&b。看看如下范例:

先计算一下a&b:

所以,最终,a=2
本节讲了位的概念,也介绍了位运算符,但对位到底怎样用,有什么用途,可能读者还比较疑惑,下一节就具体讲一讲位运算的一个实际用途。