Java基础之位运算知识总结

作者:董一刀 时间:2022-09-10 17:48:43 

一、位运算的分类与展现效果

java位运算可以分为左移和右移,其中右移还有无符号右移。

Java基础之位运算知识总结

java只对整型位移,可以分为int体系和long体系。int体系包括(byte, short, int, char),long体系只包含long。int体系中进行位运算时,除int类型外都会先转换为int再进行运算。.
无符号右移指的是,向右移动时,左边补位的是0。
一般来说,右移左移常用作乘2n 或者除以2n。(右移除以2n,左移乘以2n)


int i1 = 4;
int r1 = i1 >> 2; // 除以2^2
int r2 = i1 << 2; // 乘以2^2
System.out.println(r1); // 1
System.out.println(r2); // 16

二、原理

位运算实际上是将数值对应的二进制进行左右位移操作。java中数值的存储、运算是以补码的形式进行的。数值有三种存储方式:原码、反码、补码。

原码的最高位为符号位(0为正数,1为负数),其余位用于存储数值,以8位整型为例,2对应:


0000 0010

-2对应:


1000 0010

  反码和补码的正数都与原码相同。反码的负数在原码的基础上进行,除符号位外,其余按位取反。例如2的反码为:


0000 0010(正数不变)

-2的反码为:


1111 1101

补码在反码的基础上进行,反码加1就变成补码。

2:


0000 0010(正数不变)

-2为:


1111 1110

8位整型,反码可以表示的范围为:[-128,127]

-128的反码表示为:


1000 0000

可以理解为:


1 1000 0000(原) => 1 0111 1111(反) => 1 1000 0000(补) => 1000 0000(补)

(查看了一些解释,-128的补码规定为1000 0000,若不理解,可以先跳过。)

左移即是补码向左移动,右边空出的用0补位,右移就是向右动,左边空出来的以符号位补位。(无符号右移,左边空出来的以0补位)。下面以具体代码举例(int 为32位):

正数:


int i1 = 4; // 0000 0000 0000 0000 0000 0000 0000 0100
int r1 = i1 >> 2; // 期望 0000 0000 0000 0000 0000 0000 0000 0001 = 1
int r2 = i1 << 2; // 期望 0000 0000 0000 0000 0000 0000 0001 0000 = 16
System.out.println(r1); // 实际:1
System.out.println(r2); // 实际:16

负数:


int i2 = -4; // 1111 1111 1111 1111 _ 1111 1111 1111 1100
int r3 = i2 >> 2; // 期望:1111 1111 1111 1111 _ 1111 1111 1111 1111 = -1
int r4 = i2 << 2; // 期望:1111 1111 1111 1111 _ 1111 1111 1111 0000 = -16
int rx = i2 >>> 1; // 期望: 0111 1111 1111 1111 _ 1111 1111 1111 1110 = 2147483646
System.out.println(rx); // 实际:2147483646
System.out.println(r3); // 实际:-1
System.out.println(r4); // 实际:-16

rx记录无符号右移结果,移动后左边补位以0补满,于是结果就变成了2147483646

三、边界值测试

int类型的范围为[-2147483648, 2147483647],下面对上下界分别进行测试:


// 边界值测试:
int imax = Integer.MAX_VALUE; // 21_4748_3647 = 0111_1111_1111_1111_1111_1111_1111_1111 (2^31-1)

int r5  = imax >> 2; // 0001_1111_1111_1111_1111_1111_1111_1111 = (2^30 - 1) = 5_3687_0911

System.out.println(r5);// 实际:5_3687_0911

int r6 = max << 2; // 1111_1111_1111_1111_1111_1111_1111_1100 (补码形式 ) = -4

System.out.println(r6);// 实际:-4

int imin = Integer.MIN_VALUE; //-21_4748_3648=1000_0000_0000_0000_0000_0000_0000_0000

int r7 = imin << 1; // 0000_0000_0000_0000_0000_0000_0000_0000 = 0

System.out.println(r7); // 实际:0

根据位运算原理,在边界测试的结果并不一定是乘以2n或者除以2n。对边界值进行位运算时,需要注意。

来源:https://blog.csdn.net/weixin_43132106/article/details/116902266

标签:Java,位运算,运算符
0
投稿

猜你喜欢

  • android水平循环滚动控件使用详解

    2023-07-24 15:25:34
  • IDEA实现JDBC的操作步骤

    2021-08-29 11:08:55
  • Android中利用xml文件布局修改Helloworld程序

    2023-10-24 08:45:05
  • Java中如何动态创建接口的实现方法

    2023-11-25 15:13:02
  • Android应用创建桌面快捷方式代码

    2022-03-03 00:51:44
  • Spring注解@Configuration与@Bean注册组件的使用详解

    2022-09-13 01:52:56
  • Android项目开发 教你实现Periscope点赞效果

    2022-02-24 02:29:27
  • C# 使用Fiddler捕获本地HttpClient发出的请求操作

    2022-06-28 04:10:34
  • Java中static静态变量的初始化完全解析

    2023-11-27 21:03:39
  • IDEA 如何控制编辑左侧的功能图标ICON(操作步骤)

    2022-11-04 21:10:05
  • Java实现经典游戏打砖块游戏的示例代码

    2021-06-25 13:30:16
  • Flutter加载图片流程MultiFrameImageStreamCompleter解析

    2023-07-19 02:45:55
  • C语言关键字union的定义和使用详解

    2021-09-24 02:40:05
  • mybatis查询返回Map<String,Object>类型的讲解

    2022-12-25 02:07:38
  • C#图像处理之图像平移的方法

    2021-12-16 08:38:37
  • spring springMVC中常用注解解析

    2023-09-14 20:45:46
  • Java中Set&List的迭代器实现步骤解析

    2021-05-27 16:47:06
  • Java中的异常处理(try,catch,finally,throw,throws)

    2021-07-29 16:45:12
  • Android打包上传AAR文件到Maven仓库的示例

    2023-07-02 15:14:14
  • WPF开发技巧之花式控件功能扩展详解

    2022-07-13 05:56:52
  • asp之家 软件编程 m.aspxhome.com