那些不常用的运算符

1.非运算符 ( ~ )

int a=2;  
System.out.println("a 非的结果是:"+(~a));  

位运算都是补码运算的,2的二进制码应写8位的:00000010 按位取反为111111101,此时仍为补码,而补码转源码需要先-1,符号位不变再取反。换算为原码为:10000011 即-3。有个规律,取反都是原数+1再转为负数,如~19为-20

原码和补码转换关系

分两种情况,以八位原码转换补码为例:
正数(符号位为0的数)补码与原码相同.
负数(符号位为1的数)变为补码时符号位不变,其余各项取反,最后在末尾+1
例如:原码01100110,补码为:01100110
原码11100110,先变反码:10011001,再加1变为补码:10011010
计算机中的符号数有三种表示方法,即原码、反码和补码。三种表示方法均有符号位和数值位两部分,符号位都是用0表示“正”,用1表示“负”,而数值位,三种表示方法各不相同。 在计算机系统中,数值一律用补码来表示和存储。原因在于,使用补码,可以将符号位和数值域统一处理;同时,加法和减法也可以统一处理。此外,补码与原码相互转换,其运算过程是相同的,不需要额外的硬件电路。
特性
1、一个负整数(或原码)与其补数(或补码)相加,和为模。
2、对一个整数的补码再求补码,等于该整数自身。
3、补码的正零与负零表示方法相同。

2.移位运算符 ( << >> >>> )

<< : 左移运算符,num << 1,相当于num乘以2
>> : 右移运算符,num >> 1,相当于num除以2
>>> : 无符号右移,忽略符号位,空位都以0补齐

3.位运算符 ( 与&、或| )

把两个数字分别写成二进制形式,然后按照每一位判断,&运算符只要有一个是0就算成0, |运算符只要有一个是1 就是1

int x = 37, y = 38;  
System.out.println("x=" + Integer.toBinaryString(x) + ",y=" + Integer.toBinaryString(y));  
System.out.println("x | y = " + (x | y));  
System.out.println("x & y = " + (x & y));  
x=100101,y=100110  
x | y = 39  
x & y = 36  

4. 异或运算符 ( ^ )

二进制每一位相同输出0,不同输出1

int x = 37, y = 38;  
x ^ y == 11(2) == 3  

推荐

  • 10进制快速转二进 制(https://www.zhihu.com/question/33572547#JackAlan)

    一般算比较小的数字的话,就先找小于并且临这个数最近的2的N次方。然后依次。 比如 37 = 32 + 4 + 1
    对应的就是 100101(32 16 8 4 2 1 有的写1,反之写0)