位运算相关(一)——位运算学习笔记
简介
位运算,是程序设计的一个重要领域,将数字转化为二进制之后再按位进行运算,效率高,是编程的一个重点知识。
&(与运算)
概念
与运算的运算符为\(\&\)。当两个数进行与运算时,将其二进制进行操作,对于每一位,只有两个数这一位的值都是\(1\),它的值才为\(1\),否则为\(0\)。也就是说,\(1\&1=1,1\&0=0,0\&1=0,0\&0=0\)。
举例
以\(11\&7\)为例。
\(11\)的二进制是\(1011,7\)的二进制是\(111\)(方便起见,我们将其写作\(0111\)),将它们每一位逐一比较,右起第一位为\(1\),第二位也为\(1\),由于\(1011\)第三位为\(0,0111\)第四位为\(0\),所以运算结果的第三位和第四位为\(0\)。最后结果就是\(0011\),即\(11\&7=3\)。
\(|\)(或运算)
概念
或运算的运算符为\(|\)。当两个数进行或运算时,将其二进制进行操作,对于每一位,只要两个数中有一个这一位的值为\(1\),它的值就为\(1\),只有两个数这一位的值都是\(0\),它的值才为\(0\)。也就是说,\(1|1=1,1|0=1,0|1=0,0|0=0\)。
举例
以\(11|7\)为例。
\(11\)的二进制是\(1011\),7的二进制是\(0111\),将它们每一位逐一比较,可得每一位两个数中都有至少一个值为\(1\)。最后结果就是\(1111\),即\(11|7=15\)。
^(异或运算)
概念
异或运算的运算符为。当两个数进行异或运算时,将其二进制进行操作,对于每一位,只有当两个数上这一位的数字不同,它的值才为$1$,若值相同,则为$0$。也就是说,$1$\(1=0\),\(1\)$0=1$,$0$\(1=1\),\(0\)^\(0=0\)。
举例
以\(11\)^\(7\)为例。
\(11\)的二进制是\(1011\),\(7\)的二进制是\(0111\),将它们每一位逐一比较,右起第一位和第二位上两个数值都为\(1\),所以结果上这两位为\(0\),而第三位和第四位上两个数值一个为\(1\)一个为\(0\),数字不同,所以结果上这两位为\(1\)。最后结果就是\(1100\),即\(11\)^\(7=12\)。
\(\sim\)(取反运算)
概念
取反运算的运算符为\(\sim\)。取反运算是一个单目运算符,只对一个数进行运算。当对一个数进行取反运算时,将其二进制进行操作,对于每一位,若原来的值为\(1\),则结果的值为\(0\),若原来的值为\(0\),则结果的值为\(1\),相当于取与原值相反的数。也就是说,\(\sim1=0,\sim0=1\)。
举例
以\(\sim11\)为例。
\(11\)的二进制是\(1011\),对每一位进行操作,由于右起第\(1,2,4\)位原值为\(1\),所以结果上这三位值为\(0\),由于右起第\(3\)位原值为\(0\),所以结果上这位值为\(1\)。最后结果就是\(0100\),即\(\sim11=4\)。
\(<<\)(左移运算)
概念
左移运算的运算符为\(<<\)。当两个数进行左移运算时,设运算符左边的数为\(x\),右边的数为\(y\),则结果是\(x\)在二进制下向左移动\(y\)位所得的值,相当于\(x\)乘上\(2^y\)。
举例
以\(11<<2\)为例。
\(11\)的二进制是\(1011\),将\(11\)在二进制下左移\(2\)位,可得\(101100\)。最后结果就是\(101100\),即\(11<<2=44\)。
\(>>\)(右移运算)
概念
右移运算的运算符为\(>>\)。当两个数进行右移运算时,设运算符左边的数为\(x\),右边的数为\(y\),则结果是\(x\)在二进制下向右移动y位所得的值,相当于\(x\)整除\(2^y\)。
举例
以\(11>>2\)为例。
\(11\)的二进制是\(1011\),将\(11\)在二进制下右移\(2\)位,可得\(10\)。最后结果就是\(10\),即\(11>>2=2\)。
位运算的优先级
\(1:\sim\)
\(2:<<,>>\)
\(3:\&\)
\(4:\)^
\(5:|\)