如果连二进制的知识还没搞懂, 那么计算机最基础的你都还没明白, 所以2进制对我们程序员来说, 是必会, 必学的知识
二进制在运算中的说明:
一. 二进制是逢2进位的进位制, 0,1是基本算符
二. 现代的电子计算机技术全部采用的是二进制, 因为它只使用0, 1两个数字符号,非常简单方便, 易于用电子方式实现。计算机内部处理的信息, 都是采用二进制数来表示的, 二进制 (Binary) 数用0和1两个数字及其组合来表示任何数。进位规则是"逢2进1", 数字1在不同的位上代表不同的值, 按从右至左的次序, 这个值以二倍递增.
-  1. 请看下面代码, 回答a, b, c, d, e结果是多少? 
        int a = 1>>2; //向右位移2位int b = -1>>2;int c = 1<<2;int d = -1<<2;int e = 3>>>2;//算术右移
//        a,b,c,d,e结果是多少?System.out.println("a ="+a);System.out.println("b ="+b);System.out.println("c ="+c);System.out.println("d ="+d);System.out.println("e ="+e);
-  请回答在java中, 下面的表达式运算结果是: (位操作), 练习题 
~2=? //按位取反
2&3=? // 2按位与3
2|3=? //
~-5=?
13&7=?
5|4=?
-3^3=? //按位异或
原码-反码-补码(重点 难点)
这些是计算机底层运行的最重要的机制, 很多程序员他们舍本逐末, 天天都在学框架, 然后学所谓的底层, 连最基本的都没搞懂, 你说他能行嘛
网上对原码, 反码, 补码的解释过于复杂, 我这里精简几句话:(背下来), 这里背下来不是我规定的也不是老师规定的, 是计算机的设计者冯诺伊曼早就规定好的, 我们必须背下来
对于有符号的而言:
-  1. 二进制的最高位是符号位: 0 表示正数, 1 表示负数 (口诀: 0->0 1-> -) 符号位就是代表正或负 0正数, 1负数 
-  2. 正数的原码, 反码, 补码都一样 (三码合一) 
-  3. 负数的反码 = 它的原码符号位不变, 其它位取反 (0->1,1->0) 什么是其它取反就是 0变1, 1变0 
-  4. 负数的补码 = 它的反码 +1, 负数的反码 = 负数的补码 - 1 
-  5. 0 的反码, 补码都是 0 
-  6. java没有无符号数, 换言之, java中的数都是有符号的 
-  7. 在计算机位运算的时候, 都是以补码的方式来运算的. 他为什么要以补码的方式来运算呢? : 因为补码它可以解决正数和负数, 它把正数和负数用补码统一起来了, 所以设计者设计这种原码反码补码的规则特别的科学 
-  8. 当我们看运算结果的时候, 要看它的原码 (重点) 
以上这些是一定一定要背下来的!!! 你如果背不住怎么办呢? 那你就多背几遍, 这个是一定要背下来的, 这个背不下来,我告诉大家你当程序员说实话很失败的.
按位运算符
-  java中有7个位运算符(&, |, ^, ~, >>, <<和>>>) 
分别是 按位与&, 按位或, 按位异或^, 按位取反~, 它们的运算规则是:
按位与 & :
两位全为1, 结果为1, 否则为0
举例:
比如我两个二进制 10010001 , 11110010 = 10010000
按位或 | :
两位有一个为1, 结果为1, 否则为0
按位异或 ^ :
两位一个为0, 一个为1, 结果为1, 否则为0
按位取反 ~ :
0 -> 1 , 1 -> 0
比如: 2&3=? -2=? ~~2=? 2|3=? 2^3=?
//        位运算
//        1.先得到 2的补码 => 2的原码  首先2是int(4个字节) 一个字节为8位数 00000000 00000000 00000000 00000010
//          2的补码 00000000 00000000 00000000 00000010
//        2.3的补码 3的原码 00000000 00000000 00000000 00000011
//          3的补码 00000000 00000000 00000000 00000011
//        3.按位&
//          00000000 00000000 00000000 00000010
//          00000000 00000000 00000000 00000011
//          00000000 00000000 00000000 00000010 & 运算后的补码
//          运算后的原码 也是 00000000 00000000 00000000 00000010
//          结果就是 2System.out.println(2&3); //2//        推导
//        1. 先得到 -2 的原码 10000000 00000000 00000000 00000010
//        2. -2的反码  1111111 11111111 11111111 11111101
//        3. -2的补码  1111111 11111111 11111111 11111110
//        4. ~-2操作 00000000 00000000 00000000 00000001 运算后的补码
//        5. 运算后的原码 就是  00000000 00000000 00000000 00000001 => 1System.out.println(~-2); //1//        推导
//        1. 得到2的补码 00000000 00000000 00000000 00000010
//        2. ~2操作 按位取反 11111111 11111111 11111111 11111101 运算后的补码
//        3. 运算后的反码 11111111 11111111 11111111 11111100
//        3. 运算后的原码 10000000 00000000 00000000 00000011 => -3System.out.println(~2); //-3移位操作符
-  还有三个运算符 >> , << 和 >>>, 运算规则: 
1.
算数右移 >>: 低位溢出, 符号位不变, 并用符号位补溢出的高位
2.
算数左移 <<: 符号位不变,低位补0
3.
>>>: 逻辑右移也叫无符号右移, 运算规则是: 低位溢出, 高位补0
4.
特别说明: 没有 <<< 符号
-  应用案例 BitOperator 
        int a = 1 >> 2; //1 => 000000001 本质 1 / 2 / 2 =0int c = 1 << 2; //1 => 00000001 => 00000100 本质 1 * 2 * 2 = 4int d = 4 << 3; //4 => 本质 4 * 2 * 2 * 2 = 24int e = 15 >> 2; // 本质  15 / 2 / 2 = 3System.out.println(a); //0System.out.println(c); //4System.out.println(d); //24System.out.println(e); //3