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


    说明

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

    在系统中,一个字节占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 的类型可以是 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;移位运算速度高于乘除运算。

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

  • 相关阅读:
    js箭头函数
    计算机毕业设计springboot+vue基本微信小程序的水库巡检系统
    每日一题27:数据操作之分数排名
    NIO知识总结四
    神经网络logistic回归模型,logistic回归的基本理论
    游戏中UI的性能优化手段
    无协同资源创新打法,这几个品牌在双11「品牌嘉年华」实现品效双收
    整形和浮点型是如何在内存中的存储
    【C语言】-动态内存管理
    电子表电路
  • 原文地址:https://blog.csdn.net/m290345792/article/details/126614667