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得到原码
正数的原码 反码 补码都是一样的