Java中左移和右移问题图文详解

作者:CLAY超 时间:2023-02-14 15:44:05 

 1 原码、反码、补码

原码:将十进制转化为二进制即原码;

反码:正数的反码与原码相同,负数的反码(除却最高位的符号位不变)与原码相反;

补码:正数的补码与原码相同,负数的补码(除却最高位的符号位不变)与原码的取反加一。

举例:5 和 -5

5:

原码:0 0000000 00000000 00000000 00000101

反码:0 0000000 00000000 00000000 00000101

补码:0 0000000 00000000 00000000 00000101

-5:

原码:1 00000000 00000000 00000000 00000101

反码:1 1111111 11111111 11111111 11111010

补码:1 1111111 11111111 11111111 11111011

2 位移操作

我们需要知道将一个数字,在计算机中进行移动多少位,例如8<<1代表将8转化为二进制在计算机中左移1位,低位补零;

<<:左移:低位补0

>>:有符号右移:正数高位补0,负数高位补1

>>>:无符号右移,高位补零

为什么没有无符号左移呢?因为左移的情况下只存在补零的情况。

举例 :5 和 -5

5<<1

原码:0 0000000 00000000 00000000 00000101

左移1位:0 0000000 00000000 00000000 00001010

即:10

-5<<1

原码:1 00000000 00000000 00000000 00000101

补码:1 1111111 11111111 11111111 11111011

左移1位:1 1111111 11111111 11111111 11110110

取其补码:1 0000000 00000000 00000000 00001010

即:-10

5>>1

原码:0 0000000 00000000 00000000 00000101

右移1位:0 0000000 00000000 00000000 00000010

即:2

-5>>1

原码:1 00000000 00000000 00000000 00000101

补码:1 1111111 11111111 11111111 11111011

右移1位:1 1111111 11111111 11111111 11111101

取其补码:1 0000000 00000000 00000000 00000011

即:-3

5>>>1:与5>>1一样,都是高位补0

原码:0 0000000 00000000 00000000 00000101

右移1位:0 0000000 00000000 00000000 00000010

即:2

-5>>>1

原码:1 00000000 00000000 00000000 00000101

补码:1 1111111 11111111 11111111 11111011

右移1位:0 1111111 11111111 11111111 11111101

即:2147483645

代码运行截图

Java中左移和右移问题图文详解

总结:

位移操作很简单,使用补码移动,补齐空缺位就行,除了>>:补与最高位一致的;其他移动哪缺哪补零。

在java中无论截图中的a定义成 byte,short,int哪一种类型,它默认都是使用int类型(4字节32位),你使用long(8字节64位)

3 补充操作符

~(按位非):

逐位取反

|(按位或):

一真为真

1|0=1,

0|0=0,

1|1=1,

0|1=1

&(按位与):

两真为真

1|0=0,

0|0=0,

1&1=1;

0&1=0

^(按位异或):

相异为真

1^1=0

1^0=1

0^1=1

0^0=0.

来源:https://blog.csdn.net/wxc1207/article/details/121443523

标签:java,左移,右移
0
投稿

猜你喜欢

  • 深入理解Java设计模式之享元模式

    2023-11-10 17:20:51
  • JVM类运行机制实现原理解析

    2023-11-01 18:26:20
  • Java IO流 文件传输基础

    2023-08-24 13:27:11
  • java 配置MyEclipse Maven环境具体实现步骤

    2021-07-31 04:12:23
  • Java遗传算法之冲出迷宫

    2022-01-12 21:34:58
  • 详解SpringBoot+Lucene案例介绍

    2023-03-05 01:15:22
  • Android线程管理之ActivityThread

    2022-05-08 07:48:35
  • Java系统的高并发解决方法详解

    2021-08-23 08:39:50
  • 必须了解的高阶JAVA枚举特性!

    2021-11-04 11:26:00
  • Android GSYVideoPlayer视频播放器功能的实现

    2022-01-12 23:57:08
  • C#获得程序的根目录以及判断文件是否存在的实例讲解

    2022-12-07 18:00:27
  • Java-JFrame-swing嵌套浏览器的具体步骤

    2022-11-26 19:30:10
  • Spring Boot 与DBunit 配合使用方法

    2022-07-29 13:29:28
  • 使用Android studio编写一个小的jni程序

    2023-11-07 11:05:03
  • Java8中 LocalDate和java.sql.Date的相互转换操作

    2022-01-05 20:01:28
  • Java受检异常的一些思考

    2021-06-08 08:22:16
  • JavaSE的逻辑控制你了解吗

    2023-01-07 01:32:22
  • 详解SpringBoot中Session超时原理说明

    2022-01-24 06:40:49
  • java web个人通讯录系统设计

    2022-09-14 11:12:15
  • 关于Springboot中JSCH的使用及说明

    2023-11-28 02:32:16
  • asp之家 软件编程 m.aspxhome.com