Java按位运算符(&、|、~、^)和移位运算符(>>)介绍和用法

二进制数表现形式称为“有符号的二进制补码反码

按位运算符

按位运算符用来操作整数基本数据类型中的单个“比特(bit)”,即二进制。按位操作符会对两个参数中对应的位执行布尔代数运算,并最终生成一个结果。

&:如果两个输入位都是1,则按位“”操作符(&)生成一个输出位1;否则生成一个输出位0

| :如果两个输入位里只有一个是1,则按位“”操作符( | )生成一个输出位1;只有在两个输入位都是0的情况下,它才会生成一个输出位0

^:如果输入位的某一个是1,但不全都是1,那么按位“异或”操作符( ^ )生成一个输出位1

~:按位“”( ~ ),也称为取反操作符,它属于一元操作符,只对一个操作数进行操作。按位“”生成与输入位相反的值——若输入0,则输出1;若输入1,则输出0

按位运算符与“=”的联用:按位操作符可与等号(=)联合使用,以便合并运算和赋值:&=、|=和^=都是合法的(由于“~”是一元运算符,所以不可以与“=”联用)

移位运算符

移位运算符操作的运算对象也是二进制的“位”。移位操作符只可用来处理整数类型。

左移位运算符<<)能按照操作符右侧指定的位数将操作符左边的操作数向左移动(在低位补0)

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

“无符号”右移位运算符>>>)它使用“零扩展”无论正负,都在高位插入0

“移位”可与“等号”组合使用<<=或>>=或>>>=)此时,操作符左边的值会被移动由右边的值指定的位数,再将得到的结果赋给左边的变量。但在“无符号”右移位结合赋值操作时,可能会遇到一个问题:如果对byte或short值进行这样的移位,得到的不正确的结果。它们会先转化为int类型,再进行右移操作,然后被阶段至byte、short所对应的位数,赋给原来的类型(毕竟它们自身的二进制位数是有差距的,当然截断至原来类型的位数也就是原类型了)。

注意:如果对char、byte、short类型的数值进行移位处理,那么在移位进行之前,它们会被转成int类型,并且得到的结果也是一个int类型(类似自动类型提升)。只有数值右端的低5位才有用。这样可防止我们移位超过int型值所具有的位数(因为2的5次方为32,而int类型值只有32位)。若对一个long类型的数值进行处理,最后得到的结果也是long类型。此时只会用到数值右端的低6位,以防止移位超过long型值具有的位数

发布了103 篇原创文章 · 获赞 162 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/weixin_44170221/article/details/104727741