您的位置:首页 > 科技 > 能源 > 位运算符——原码-反码-补码(重点 难点)【二进制在运算中的说明】

位运算符——原码-反码-补码(重点 难点)【二进制在运算中的说明】

2024/10/7 6:50:08 来源:https://blog.csdn.net/zzx_mn/article/details/139253260  浏览:    关键词:位运算符——原码-反码-补码(重点 难点)【二进制在运算中的说明】

如果连二进制的知识还没搞懂, 那么计算机最基础的你都还没明白, 所以2进制对我们程序员来说, 是必会, 必学的知识

二进制在运算中的说明:

一.  二进制是逢2进位的进位制, 0,1是基本算符

二.  现代的电子计算机技术全部采用的是二进制, 因为它只使用0, 1两个数字符号,非常简单方便, 易于用电子方式实现。计算机内部处理的信息, 都是采用二进制数来表示的, 二进制 (Binary) 数用0和1两个数字及其组合来表示任何数。进位规则是"逢2进1", 数字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. 1.

    二进制的最高位是符号位: 0 表示正数, 1 表示负数 (口诀: 0->0 1-> -)

    符号位就是代表正或负 0正数, 1负数

  2. 2.

    正数的原码, 反码, 补码都一样 (三码合一)

  3. 3.

    负数的反码 = 它的原码符号位不变, 其它位取反 (0->1,1->0)

    什么是其它取反就是 0变1, 1变0

  4. 4.

    负数的补码 = 它的反码 +1, 负数的反码 = 负数的补码 - 1

  5. 5.

    0 的反码, 补码都是 0

  6. 6.

    java没有无符号数, 换言之, java中的数都是有符号的

  7. 7.

    在计算机位运算的时候, 都是以补码的方式来运算的.

    他为什么要以补码的方式来运算呢? : 因为补码它可以解决正数和负数, 它把正数和负数用补码统一起来了, 所以设计者设计这种原码反码补码的规则特别的科学

  8. 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. 1.

    算数右移 >>:  低位溢出, 符号位不变, 并用符号位补溢出的高位

  2. 2.

    算数左移 <<: 符号位不变,低位补0

  3. 3.

    >>>: 逻辑右移也叫无符号右移, 运算规则是: 低位溢出, 高位补0

  4. 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

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com