binary

来源:互联网 发布:return java 编辑:程序博客网 时间:2024/05/21 10:07

二进制

2进制在哪里?

计算机内部 只有 2进制数据!

int i = 50;System.out.println(i);//"50"   Integer.toString(i)

Java编程语言, 编程语言利用算法支持10进制, 使用用户感受上可以使用10进制!

编程语言: 人类与计算机沟通的桥梁!

显示2进制数据

int i = 50;// Integer.parseInt();System.out.println(Integer.toBinaryString(i));
  • Java 如何接收10进制数据: Integer.parseInt();
    • 将10进制字符串转换为2进制int
  • Java 如何输出10进制数据: Integer.toString();

    • 将2进制int转换为10进制字符串

    Scanner in = new Scanner(System.in);
    int n = in.nextInt();// 底层调用了 Integer.parseInt();

什么是2进制

逢2进1的计数规则

这里写图片描述

16进制

16进制用于简写2进制

4位2进制可以简写为一位16进制数字

这里写图片描述

经典面试题:

int i = 0x32; //0011 0010System.out.println(i);如上代码输出结果(  ) 答案: 50int i = 0xac;  System.out.println(i);如上代码输出结果(  ) 答案:  

补码

计算机处理 有符号数(负数) 问题的算法.

补码算法: 4位数补码

规则:

  1. 总的位数是4位数
  2. 如果计算结果超过4位自动溢出舍弃

这里写图片描述

经典面试题目:

int n = 0xffffffff;System.out.println(n);如上代码输出结果是:( )A.2147483647 B.-2147483648 C.-2147483647 D.-1答案: D判断对错: 正数相加溢出结果是负数?答案: 错!System.out.println(~8+1);  输出结果是(  )答案: -8System.out.println(~8);    输出结果是(  )答案: -9System.out.println(~-8);   输出结果是(  )答案: 7 

 2进制运算符

~ 取反(非)
& 与运算
| 或运算
>>> 逻辑右移动运算
>> 数学右移动运算
<< 左移动运算

& 与运算

0 & 0 = 00 & 1 = 01 & 0 = 01 & 1 = 1n = 01001001 01110111 10101010 01010101m = 00000000 00000000 00000000 00111111 &---------------------------------------k = 00000000 00000000 00000000 00010101int n = '中';int m = 0x3f;int k = n&m;println(Integer.toBinaryString(n));println(Integer.toBinaryString(m));println(Integer.toBinaryString(k));

| 或运算(逻辑+)

0 | 0 = 00 | 1 = 11 | 0 = 11 | 1 = 1n = 00000000 00000000 00000000 00101101m = 00000000 00000000 00000000 10000000 | ----------------------------------------k = 00000000 00000000 00000000 10101101int n = 0x2d;int m = 0x80;int k = n | m;println(Integer.toBinaryString(n));println(Integer.toBinaryString(m));println(Integer.toBinaryString(k));

>>> 逻辑右移动运算

n =       00100010 01111010 10101010 10111011m = n>>>1 000100010 01111010 10101010 1011101 k = n>>>2 0000100010 01111010 10101010 101110int n = 0x227aaabb;int m = n>>>1;int k = n>>>2;int j = n>>>6;//按照2进制输出

这里写图片描述

移位运算的数学意义

移动小数点运算:

124238.  小数点向右移动1242380. 小数点向右移动 1次, 数值*1012423800. 小数点向右移动 2次, 数值*10*10假设小数点位置不变  124238. 数字向左移动 1242380. 数字向左移动 1次, 数值*1012423800. 数字向左移动 2次, 数值*10*10

2进制数字移动, 与10进制数字移动规律相同: 2进制数值向左移动一次, 数值*2

n    = 00000000 00000000 00000000 00110010. = 50n<<1 = 0000000 00000000 00000000 001100100. = 100n<<2 = 000000 00000000 00000000 0011001000. = 200

案例:

int n = 50;int m = n<<1;println(m); //100

>> 数学右移位计算:

  1. 相当于将原数据进行除法, 结果向小方向取整数.
  2. >> 数学移位: 正数高位补0, 负数高位补1, 有数学意义
  3. >>> 逻辑移位: 高位补0, 负时候没有数学意义

案例:

n    = 11111111 11111111 11111111 11110111  -9n>>1 = 111111111 11111111 11111111 1111011  -5n>>>1= 011111111 11111111 11111111 1111011  很大

案例:

...

一般情况下单纯的将数字向右移动, 请使用 >>>

面试题:

优化 n*8 的计算为 (   )答案: n<<3优化 n*16 的计算为 (   )答案: n<<4
原创粉丝点击