java运算符记录

1、负数转二进制

负数的二进制转换,其实,容易,容易理解。首先,来个-5,实践出真知嘛。把5转化为二进制字节形式。得到0101,然后补零就是00000101(这里用八位表示二进制)。这个生成原码,然后,取反(0的变成1,1的变成0。)/*一个整数按照绝对值大小转换成的二进制数,是为原码。*/,取反之后就是11111010,(这就是反码就是和原码是相反的),然后反码加1,加1之后的结果是11111011,这就生成了补码(补码就是反码加1),

2、<<=是什么意思

int capacity = 1;
capacity <<= 4;
System.out.println(capacity);
16
相当于把capacity的值1左移4位然后再赋值给capacity,结果就是16

3、<<左位移  >>右位移 >>>无符号位移

System.out.println(1 << 3);
System.out.println(1 >> 3);
结果是:8
结果是:0
1<<3就是1乘以2的三次方,2^3的结果是8,1*=8,所以结果是8.(其实就是1的二进制左移3位,负数也是一样)
1>>3就是1乘除以2的三次方,2^3的结果是8,1/8=0,所以结果是0 (其实就是1的二进制右移移3位,负数的二进制是其正数的二进制先取反然后补码)   .
PS:有些人说左移N为就是乘以2^N方其实是不准确的,虽然有很大一部分数字类型适用这个方法,但还是先转换成二进制然后进行位移计算比较好。
无符号右移运算符>>>和右移运算符>>是一样的,只不过右移时左边是补上符号位,而无符号右移运算符是补上0,也就是说,对于正数移位来说等同于:>>,
负数通过此移位运算符能移位成正数。
二进制中判断一个数字是正数还是负数只需要看它的最高位就行(最高位就是最左边的那一位),最高位0表示正数,1表示负数。
关于这个三个位移这连接比较详细(我写的只是方便自己记忆):https://zhuanlan.zhihu.com/p/30108890其实就是1的二进制左移3位,负数也是一样)
1>>3就是1乘除以2的三次方,2^3的结果是8,1/8=0,所以结果是0 (其实就是1的二进制右移移3位,负数的二进制是其正数的二进制先取反然后补码)   .
PS:有些人说左移N为就是乘以2^N方其实是不准确的,虽然有很大一部分数字类型适用这个方法,但还是先转换成二进制然后进行位移计算比较好。
无符号右移运算符>>>和右移运算符>>是一样的,只不过右移时左边是补上符号位,而无符号右移运算符是补上0,也就是说,对于正数移位来说等同于:>>,
负数通过此移位运算符能移位成正数。
二进制中判断一个数字是正数还是负数只需要看它的最高位就行(最高位就是最左边的那一位),最高位0表示正数,1表示负数。
关于这个三个位移这连接比较详细(我写的只是方便自己记忆):https://zhuanlan.zhihu.com/p/30108890

4、位与运算符&

位与运算a&b,就是数字a的二进制和b的二进制的相同位进行对比,两个都是1则结果是1,否则为0,例:10&12,10的二进制是1010,12的二进制是1100,
10的二进制:  1010
12的二进制:  1100
&运算的结果:1000,转换成10进制就是8,实验结果

5、位或运算符|

 

位与运算a|b,就是数字a的二进制和b的二进制的相同位进行对比,只要有一个是1则结果是1,否则为0,例:10&12,10的二进制是1010,12的二进制是1100,
10的二进制:  1010
12的二进制:  1100
|运算的结果:  1110,转换成10进制就是14,实验结果

public static void main(String[] args) {
        System.out.println(Integer.toBinaryString(10));
        System.out.println(Integer.toBinaryString(12));
        System.out.println(Integer.toBinaryString(14));
}
1010
1100
1110
14

6、异或运算符^

异或运算符是用符号“^”表示的,其运算规律是:两个操作数的位中,相同则结果为0,不同则结果为1。
例:12^13
12的二进制:1100
13的二进制:1101
异或结果:    0001 转成10进制结果是1

 public static void main(String[] args) {
        System.out.println(Integer.toBinaryString(12));
        System.out.println(Integer.toBinaryString(13));
        System.out.println(Integer.toBinaryString(12 ^ 13));
        System.exit(0);
}
1100
1101
1

7、非运算符~

非运算符用符号“~”表示,其运算规律如下:如果位为0,结果是1,如果位为1,结果是0,然后除符号位不变其他的按位取反,然后加1得到原码,计算成10进制就是结果。

例如~19

19的二进制是:10011,补位成八位是00010011(这里为什么要补成八位,没弄明白..求解)

然后取反结果是:                               11101100,此时的二进制是补码,转成原码是10010100 (补码转换成十进制就是符号位不变其他位按位取反加1),那么11101100转成10010011然后加1就是10010100,因为最高位是1,所以结果是负数。

public static void main(String[] args) {
        System.out.println(~19);
        System.out.println(Integer.toBinaryString(19));
}
-20
10011

负数的补码转原码就是符号位不变,其他为取反,最后+1得到原码
正数的原码 反码 补码都是一样的

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值