把博客园图标替换成自己的图标
把博客园图标替换成自己的图标end

位运算相关(一)——位运算学习笔记

简介

位运算,是程序设计的一个重要领域,将数字转化为二进制之后再按位进行运算,效率高,是编程的一个重点知识。

&(与运算)

概念

与运算的运算符为\(\&\)。当两个数进行与运算时,将其二进制进行操作,对于每一位,只有两个数这一位的值都是\(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:|\)

posted @ 2018-10-28 16:23  TheLostWeak  阅读(433)  评论(1编辑  收藏  举报