原码反码补码

原码反码补码

原码反码补码

  1. 为什么计算机底层计算需要使用补码?
    • 计算机是不能直接做减法运算的,因为普通电脑硬件中没有减法器,不需要额外的增加硬件电路制造难度,减法器无需存在。但可以优雅的转换成减法。
    • 例如:【10 - 7】可以转换成【10 + (-7)】,就这么简单。计算机的脑袋没有减法概念,不代表没有负数的概念。

位运算-基本位运算符

  1. 位运算和算术运算符的效率谁高呢?
    • 位运算效率高。
    • 在系统中运算是以二进制的形式进行,相比来说俩个二进制数相乘运算比移位运算慢一些。
  2. 位运算符中的&和|,同逻辑运算符中&和|有何区别?
    • 两者之间没有任何联系,却有相似之处。
    • 位运算中:&有0则0,|有1则1。
    • 逻辑运算符中:&有false则false,|有true则true。

位运算-位移运算符

    • 说出最高效的2 * 8的实现方式?
      • 8 << 1 或 2 << 3 或 4 << 2,其中效率最高为8<<1,因为它的操作,仅移动一位。
  1. 说出3种不同的位移运算符,以及他们各自的特点?
    • .>> : 将二进制数据整体,向右移动。 高位按符号位补位。
    • .>>> : 将二进制数据整体,向右移动。 高位不论正负全部补0。
    • .<< : 将二进制数据整体,向左移动。 低位补0。

位运算-位移运算符思考

  1. -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 补码/

数据交换

  1. 什么叫数据交换?

    • 就是将两个变量中的数据值交换。
  2. 不使用第三方变量,能不能进行数据交换?

    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] + " ");
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值