如果连二进制的知识还没搞懂, 那么计算机最基础的你都还没明白, 所以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