Java支持的位运算符
Java支持的位运算符
- &:按位与,只有两个操作数对应位同为1时,结果为1,其余全为0。(或者是只要有一个操作数为0,结果就为0),通过n&1 == 1是否成立可以判断一个数n的奇偶性,若成立,则为奇数,否则为偶数。
- |:按位或,只有两个操作数对应位同为0时,结果为0,其余全为1。(或者是只要有一个操作数为1,结果就为1)。
- ~:按位非,对应位取反即可。
^:按位异或,对应位不同为1,相同则为0。
- 任何数异或本身结果为0。
- a ^ b=b ^ a,异或是一个无顺序的运算符,则b ^ a ^ b=b ^ b ^ a,结果为0^a。
- <<:左移一位,相当于×2,m<<n相当于m*2^n
- >>:右移一位,相当于÷2
- >>>:无符号右移运算符,低位溢出,高位补0。注意,无符号右移(>>>)中的符号位(最高位)也跟着变,无符号的意思是将符号位当作数字位看待。如:-1>>>1结果为2147483647。
上述位运算符中 ,除 ~ 以 外 ,其余均为二元运算符 。 操作数只能为整型和字符型数据。
长见识:
1. 通过位运算取绝对值:原文链接
(a^(a>>31))-(a>>31)
先整理一下使用位运算取绝对值的思路:若a为正数,则不变,需要用异或0保持的特点;若a为负数,则其补码为源码翻转每一位后+1,先求其源码,补码-1后再翻转每一位,此时需要使用异或1具有翻转的特点。
任何正数右移31后只剩符号位0,最终结果为0,任何负数右移31后也只剩符号位1,溢出的31位截断,空出的31位补符号位1,最终结果为-1.右移31操作可以取得任何整数的符号位。
那么综合上面的步骤,可得到公式。a>>31取得a的符号,若a为正数,a>>31等于0,a^0=a,不变;若a为负数,a>>31等于-1 ,a^-1翻转每一位.
2. 通过位运算实现两个元素的交换
还没有评论,来说两句吧...