二进制运算符


本篇文章转载来源https://blog.csdn.net/m290345792/article/details/126614667

按位与运算符(&)

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

运算规则:如果两个二进制数的同一个位数上的数都为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 的类型可以是 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位 = 322.

在数字没有溢出的前提下,对于正数和负数,左移一位都相当于乘以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;移位运算速度高于乘除运算。

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


文章作者: Needle
转载声明:本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Needle !
  目录
  评论