需要的掌握的知识点
1. 原码
2. 补码
3. 反码
4. 位移运算
5. ~取反运算
6. & 按位与
7. | 按位或
8. ^ 按位异或
9. <<左移
10. >>右移
一、概念
1.1 原码
原码是一种计算机中对数字的二进制定点表示方法. 原码表示法在数值前面增加了一位符号位(即最高位为符号位): 正数该位为0, 负数该位为1(0有两种表示: +0和-0), 其余位表示数值的大小.
1.2 反码
正数的反码与其原码相同.
负数的反码是对正数逐位取反, 符号位保持为1
1.3 补码
正数补码等于原码
负数的补码等于原码的反码+1
1.4 为什么要有补码
java里的int是有符号的, 在内存中没有正负之分, 只有0/1, 整数是用补码表示的. 在计算机系统中, 数值一律用补码来表示和存储, 使用补码, 可以将符号位与数值域统一处理, 同时, 加法和减法也可以统一处理, 此外, 补码与原码相互转换, 其运算过程是相同的, 不需要额外的硬件电路.
1.5 正数的原码、反码、补码
数值 1:
原码: 00000000 00000000 00000000 00000001
反码: 00000000 00000000 00000000 00000001
补码: 00000000 00000000 00000000 00000001
1.6 负数的原码、反码、补码
数值 -1:
原码: 10000000 00000000 00000000 00000001
反码: 11111111 11111111 11111111 11111110
补码: 11111111 11111111 11111111 11111111
二、位移运算
2.1 Tinker in Java中的一段原话
对char, byte或者short进行移位处理, 那么在移位进行之前, 它们会自动转换成一个int, 只有右侧的5个低位才会有用. 这样可防止我们在一个int数里移动不切实际的位数. 若对一个long值进行处理, 最后得到的结果也是long. 此时只会用到右侧的6个低位, 防止移动超过long值里现成的位数.
2.2 移位操作符
移位操作符是一个二元操作符, 两个操作数分别位于移位操作两边形如: 左操作数---移位操作符---右操作数. 含义是将左操作数按照移位操作符指定的移位方向, 进行右操作数指定的次数的移位.
2.3 demo
System.out.println("15 << 34:::" + Integer.toBinaryString(15 << 34));
输出结果为: 15 << 34:::111100
结合上面的结论对上面代码进行计算:
首先右操作数为34, 二进制表现形式为100010, 只取右侧5位为00010, 结果为2,
所以实际情况是: 15右移两位 = 111100
网友评论