原码反码补码
原码反码补码
- 为什么计算机底层计算需要使用补码?
- 计算机是不能直接做减法运算的,因为普通电脑硬件中没有减法器,不需要额外的增加硬件电路制造难度,减法器无需存在。但可以优雅的转换成减法。
- 例如:【10 - 7】可以转换成【10 + (-7)】,就这么简单。计算机的脑袋没有减法概念,不代表没有负数的概念。
位运算-基本位运算符
- 位运算和算术运算符的效率谁高呢?
- 位运算效率高。
- 在系统中运算是以二进制的形式进行,相比来说俩个二进制数相乘运算比移位运算慢一些。
- 位运算符中的&和|,同逻辑运算符中&和|有何区别?
- 两者之间没有任何联系,却有相似之处。
- 位运算中:&有0则0,|有1则1。
- 逻辑运算符中:&有false则false,|有true则true。
位运算-位移运算符
-
- 说出最高效的2 * 8的实现方式?
- 8 << 1 或 2 << 3 或 4 << 2,其中效率最高为8<<1,因为它的操作,仅移动一位。
- 说出最高效的2 * 8的实现方式?
- 说出3种不同的位移运算符,以及他们各自的特点?
- .>> : 将二进制数据整体,向右移动。 高位按符号位补位。
- .>>> : 将二进制数据整体,向右移动。 高位不论正负全部补0。
- .<< : 将二进制数据整体,向左移动。 低位补0。
位运算-位移运算符思考
-
-7 >> 2和-7 >>> 2运算的结果会相同吗?
-7 >> 2 = -2 1000 0000 0000 0000 0000 0000 0000 0111 = -7 源码 1111 1111 1111 1111 1111 1111 1111 1000 反码 1111 1111 1111 1111 1111 1111 1111 1001 补码
2
1111 1111 1111 1111 1111 1111 1111 1110 补码
1111 1111 1111 1111 1111 1111 1111 1101 反码
1000 0000 0000 0000 0000 0000 0000 0010 = -2 源码
8 >> 2 = 2
0000 0000 0000 0000 0000 0000 0000 1000 = 8 源码
2
0000 0000 0000 0000 0000 0000 0000 0010 = 2
-7 >>> 2 = 1073741822
1000 0000 0000 0000 0000 0000 0000 0111 = -7 源码
1111 1111 1111 1111 1111 1111 1111 1000 反码
1111 1111 1111 1111 1111 1111 1111 1001 补码
2
0011 1111 1111 1111 1111 1111 1111 1110 补码/
数据交换
-
什么叫数据交换?
- 就是将两个变量中的数据值交换。
-
不使用第三方变量,能不能进行数据交换?
int a = 10; int b = 20; 方式1: a = a ^ b; // a = 10 ^ 20; b = a ^ b; // b = 10 ^ 20 ^ 20; b = 10; a = a ^ b; // a = 10 ^ 20 ^ 10; a = 20; 方式2: a = a + b; // a = 30; b = a - b; // b = 30 - 20 = 10; a = a - b; // a = 30 - 10 = 20; 方式3: a = a * b; // a = 200; b = a / b; // b = 200 / 20 = 10; a = a / b; // a = 200 / 10 = 20;
需求:完成下面案例。
// 定义数组
int[] arr = {1,2,3,4,5,6};
// 遍历数组,分别用start和end两个变量指向首位的元素位置
// 然后每交换一次,start++,end--,直到start >= end结束
for (int start = 0,end = arr.length-1; start < end; start++,end--) {
// 数据交换
int temp = arr[start];
arr[start] = arr[end];
arr[end] = temp;
}
// 打印数组
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + " ");
}