二进制运算符:&(与运算)|(或运算)~(取反运算)^(异或运算)位移运算符

Posted 沛沛老爹

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二进制运算符:&(与运算)|(或运算)~(取反运算)^(异或运算)位移运算符相关的知识,希望对你有一定的参考价值。

说明

所有的位运算符操作的都是二进制,而不是我们日常生活中常用的十进制。

在系统中,一个字节占8位。 

按位与运算符(&)

参加运算的两个数据,按二进制位进行“与”运算。

运算规则:如果两个二进制数的同一个位数上的数都为1,则当前位为1,否则为0.

示例:0&0=0;  0&1=0;  

按位或运算符(|)

参加运算的两个对象,按二进制位进行“或”运算。

运算规则:如果两个二进制数的同一个位数上的数有一个不为0则当前位为1,否则为0.

示例:0|0=0;  0|1=1;  1|0=1;   1|1=1;

取反运算符(~)

参加运算的一个数据,按二进制位进行“取反”运算。

示例:~1=0;  ~0=1;

异或运算符(^)

用于比较两个二进制数的相应位。在执行按位异或运算时,如果两个二进制数的相应位都为1或两个二进制数的相应位都为0,则返回 0;如果两个二进制数的相应位其中一个为1,另一个为0,则返回 1;

示例:10^15= 5  

二进制算法: 

 

位移运算符(<<)和(>>

位移运算符分为左位移运算符“<<”和右位移运算符“>>”,分别用于向左和向右执行位移运算。对于X<<N 或 X>>N 形式的运算,含义是将 X 向左或向右移动 N 位,X 的类型可以是 int,uint,long,ulong,byte,sbyte,short 和ushort 。需要注意的是,byte,sbyte,short,和 ushort 类型的值在进行位移操作后值的类型讲自动转换成 int 类型。

左移位运算符(<<)

“有符号”左移位运算符(<<)将运算符左边的运算对象向左移动运算符右侧指定的位数(在低位补0)。

例如 3 << 2。

首先把3转换为二进制数字00000000 00000000 00000000 00000011,然后把该数字高位(左侧)的两个零移出,其他的数字都往左平移2位,最后在低位(右侧)空位补零。则得到的最终结果是00000000 00000000 00000000 00001100,则转换为十进制是12。


左移1位相当于乘以2,例如 3 << 2 =12 则是将数字3左移2位 = 3*2*2.

在数字没有溢出的前提下,对于正数和负数,左移一位都相当于乘以2的1次方,左移n位就相当于乘以2的n次方。

右移位运算符(>>)

“有符号”右移位运算符(>>)则将运算符左边的运算对象向右移动运算符右侧指定的位数。
“有符号”右移位运算符使用了“符号扩展”:若值为正,则在高位插入0;若值为负,则在高位插入1。

>>运算规则:按二进制形式把所有的数字向右移动对应位数,低位移出(舍弃),高位的空位补符号位,移位后得到的数字为正数则补0,负数补1。

例如11 >> 2,则是将数字11右移2位

 11的二进制形式为:00001011,然后把低位的最后两个数字移出,因为该数字是正数,所以在高位补零。则得到的最终结果是00000010.转换为十进制是3.

右移一位相当于除2,右移n位相当于除以2的n次方。

Java也添加了一种“无符号”右移位运算符(>>>),它使用了“零扩展”:无论正负,都在高位插入0。

小结

位移运算符右移一位相当于除以2,左移一位(在不溢出的情况下)相当于乘以2;移位运算速度高于乘除运算。

位运算符的优先级 
~的优先级最高,其次是<<、>>和>>>,再次是&,然后是^,优先级最低的是|。

以上是关于二进制运算符:&(与运算)|(或运算)~(取反运算)^(异或运算)位移运算符的主要内容,如果未能解决你的问题,请参考以下文章

&(与运算)|(或运算)^(异或运算)

java运算符 与(&)非(~)或(|)异或(^)

java运算符 与(&)非(~)或(|)异或(^)

位运算计算与位运算应用

Java的位运算符详解实例——与(&)非(~)或(|)异或(^)

&位与运算符|位或运算符之权限控制算法