`

java中的位移运算测试

    博客分类:
  • java
 
阅读更多

 

参考链接:https://blog.csdn.net/sxhlovehmm/article/details/44244195

                  https://blog.csdn.net/qq_35114086/article/details/70173329

 

1、左移运算 <<

丢弃最高位(符号位同样丢弃),0补最低位

 

正数左位移:

/**
	 * 左位移测试。 丢弃最高位(符号位同样丢弃),0补最低位 如果移动的位数超过了该类型的最大位数,那么编译器会对移动的位数取模。
	 * 如对int型移动33位,实际上只移动了33%32=1位。
	 */
	@Test
	public void test3() {
		int temp = 33;
		String as = "01000000101001010101001101100101";
		// 使用Integer.parseInt方法,将as转整型时,符号位不能为1,如果要表示负数,在as左测最高位添加“-”,而符号位右侧的数值位则表示负数的绝对值原码。
		int an = Integer.parseInt(as, 2);
		System.out.println("原值:" + an + "-->" + Integer.toBinaryString(an));
		System.out.println("<<" + temp);
		int bn = an << temp;
		System.out.println("运算后:" + bn + "-->" + Integer.toBinaryString(bn));
	}

	/**
	 * temp=1,打印结果:
	 * 原值:1084576613-->100 0000 1010 0101 0101 0011 0110 0101 
	 * <<1
	 * 运算后:-2125814070-->1000 0001 0100 1010 1010 0110 1100 1010
	 * 
	 * temp=2,打印结果:
	 * 原值:1084576613-->100 0000 1010 0101 0101 0011 0110 0101  
	 * <<2
	 * 运算后:43339156-->10 1001 0101 0100 1101 1001 0100
	 * 
	 * temp=31,打印结果:
	 * 
	 * 原值:1084576613-->100 0000 1010 0101 0101 0011 0110 0101 
	 * <<31
	 * 运算后:-2147483648-->1000 0000 0000 0000 0000 0000 0000 0000
	 * 
	 * temp=32,打印结果:
	 * 原值:1084576613-->100 0000 1010 0101 0101 0011 0110 0101
	 * <<32
	 * 运算后:1084576613-->100 0000 1010 0101 0101 0011 0110 0101
	 * 
	 * temp=33,打印结果:
	 * 原值:1084576613-->100 0000 1010 0101 0101 0011 0110 0101
	 * <<33
	 * 运算后:-2125814070-->1000 0001 0100 1010 1010 0110 1100 1010
	 * 
	 */

 特殊值的二进制表示:

/**
	 * 特殊值的二进制表示
	 */
	@Test
	public void test4() {
		System.out.println(Integer.toBinaryString(-2147483648));
		System.out.println(Math.abs(-2147483648));
		System.out.println(Integer.toBinaryString(Math.abs(-2147483648)));
		System.out.println(Integer.toBinaryString(-2147483647));
		System.out.println(Integer.toBinaryString(2147483647));
		System.out.println(Integer.toBinaryString(0));
		System.out.println(Integer.toBinaryString(-1));
	}

	/**
	 * 打印结果:
	 * 10000000000000000000000000000000
	 * -2147483648
	 * 10000000000000000000000000000000
	 * 10000000000000000000000000000001
	 * 1111111111111111111111111111111
	 * 0
	 * 11111111111111111111111111111111
	 */

 

负数左位移:

 

/**
	 * 负数左移
	 */
	@Test
	public void test6() {
		int temp = 33;
		String as = "-1000000101001010101001101100101";
		// 使用Integer.parseInt方法,将as转整型时,符号位不能为1,如果要表示负数,在as左测最高位添加“-”,数值位表示负数的绝对值。
		int an = Integer.parseInt(as, 2);
		System.out.println("原值:" + an + "-->" + Integer.toBinaryString(an));
		System.out.println("<<" + temp);
		int bn = an << temp;
		System.out.println("运算后:" + bn + "-->" + Integer.toBinaryString(bn));
	}

	/**
	 * temp=1,打印结果:
	 * 
	 * 原值:-1084576613-->1011 1111 0101 1010 1010 1100 1001 1011 
	 * <<1
	 * 运算后:2125814070-->111 1110 1011 0101 0101 1001 0011 0110
	 * 
	 * 
	 * temp=2,打印结果:
	 * 
	 * 原值:-1084576613-->1011 1111 0101 1010 1010 1100 1001 1011
	 * <<2
	 * 运算后:-43339156-->1111 1101 0110 1010 1011 0010 0110 1100
	 * 
	 * 
	 * temp=31,打印结果:
	 * 
	 * 原值:-1084576613-->1011 1111 0101 1010 1010 1100 1001 1011
	 * <<31
	 * 运算后:-2147483648-->1000 0000 0000 0000 0000 0000 0000 0000
	 * 
	 * 
	 * temp=32,打印结果:
	 * 
	 * 原值:-1084576613-->1011 1111 0101 1010 1010 1100 1001 1011
	 * <<32
	 * 运算后:-1084576613-->1011 1111 0101 1010 1010 1100 1001 1011
	 * 
	 * 
	 * temp=33,打印结果:
	 * 
	 * 原值:-1084576613-->1011 1111 0101 1010 1010 1100 1001 1011
	 * <<33
	 * 运算后:2125814070-->111 1110 1011 0101 0101 1001 0011 0110
	 * 
	 */

 

2、右移运算 >>

 

符号位不变,左边补上符号位 

 

 正数右位移:

/**
	 * 正数右位移
	 */
	@Test
	public void right1() {
		int temp = 33;
		String as = "01000000101001010101001101100101";
		int an = Integer.parseInt(as, 2);
		System.out.println("原值:" + an + "-->" + Integer.toBinaryString(an));
		System.out.println(">>" + temp);
		int bn = an >> temp;
		System.out.println("运算后:" + bn + "-->" + Integer.toBinaryString(bn));
	}
	
	/**
	 * temp=1,打印结果:
	 * 原值:1084576613-->100 0000 1010 0101 0101 0011 0110 0101
	 * >>1
	 * 运算后:542288306-->10 0000 0101 0010 1010 1001 1011 0010
	 * 
	 * temp=2,打印结果:
	 * 原值:1084576613-->100 0000 1010 0101 0101 0011 0110 0101
	 * >>2
	 * 运算后:271144153-->1 0000 0010 1001 0101 0100 1101 1001
	 * 
	 * temp=31,打印结果:
	 * 原值:1084576613-->100 0000 1010 0101 0101 0011 0110 0101
	 * >>31
	 * 运算后:0-->0
	 * 
	 * temp=32,打印结果:
	 * 原值:1084576613-->100 0000 1010 0101 0101 0011 0110 0101
	 * >>32
	 * 运算后:1084576613-->100 0000 1010 0101 0101 0011 0110 0101
	 * 
	 * temp=33,打印结果:
	 * 原值:1084576613-->100 0000 1010 0101 0101 0011 0110 0101
	 * >>33
	 * 运算后:542288306-->10 0000 0101 0010 1010 1001 1011 0010 
	 * 
	 */

 

负数右位移:

/**
	 * 负数右位移
	 */
	@Test
	public void right2() {
		int temp = 33;
		String as = "-01000000101001010101001101100101";
		int an = Integer.parseInt(as, 2);
		System.out.println("原值:" + an + "-->" + Integer.toBinaryString(an));
		System.out.println(">>" + temp);
		int bn = an >> temp;
		System.out.println("运算后:" + bn + "-->" + Integer.toBinaryString(bn));
	}
	

	/**
	 * temp=1,打印结果:
	 * 原值:-1084576613-->1011 1111 0101 1010 1010 1100 1001 1011
	 * >>1
	 * 运算后:-542288307-->1101 1111 1010 1101 0101 0110 0100 1101
	 * 
	 * temp=2,打印结果:
	 * 原值:-1084576613-->1011 1111 0101 1010 1010 1100 1001 1011
	 * >>2
	 * 运算后:-271144154-->1110 1111 1101 0110 1010 1011 0010 0110
	 * 
	 * temp=31,打印结果:
	 * 原值:-1084576613-->1011 1111 0101 1010 1010 1100 1001 1011
	 * >>31
	 * 运算后:-1-->1111 1111 1111 1111 1111 1111 1111 1111
	 * 
	 * temp=32,打印结果:
	 * 原值:-1084576613-->1011 1111 0101 1010 1010 1100 1001 1011
	 * >>32
	 * 运算后:-1084576613-->1011 1111 0101 1010 1010 1100 1001 1011
	 * 
	 * temp=33,打印结果:
	 * 原值:-1084576613-->1011 1111 0101 1010 1010 1100 1001 1011
	 * >>33
	 * 运算后:-542288307-->1101 1111 1010 1101 0101 0110 0100 1101
	 */
	

 

 3、无符号右移

忽略了符号位扩展,0补最高位 

 

正数右移:

 

/**
	 * 无符号右移:正数
	 */
	@Test
	public void right3() {
		int temp = 33;
		String as = "1000000101001010101001101100101";//1100 0000 1010 0101 0101 0011 0110 0101
		int an = Integer.parseInt(as, 2);
		System.out.println("原值:" + an + "-->" + Integer.toBinaryString(an));
		System.out.println(">>>" + temp);
		int bn = an >>> temp;
		System.out.println("运算后:" + bn + "-->" + Integer.toBinaryString(bn));
	}
	
	/**
	 * temp=1,打印结果: 
	 * 原值:1084576613-->100 0000 1010 0101 0101 0011 0110 0101
	 * >>>1
	 * 运算后:542288306-->10 0000 0101 0010 1010 1001 1011 0010
	 * 
	 * temp=2,打印结果: 
	 * 原值:1084576613-->100 0000 1010 0101 0101 0011 0110 0101
	 * >>>2
	 * 运算后:271144153-->1 0000 0010 1001 0101 0100 1101 1001
	 * 
	 * temp=31,打印结果: 
	 * 原值:1084576613-->100 0000 1010 0101 0101 0011 0110 0101
	 * >>>31
	 * 运算后:0-->0
	 * 
	 * temp=32,打印结果: 
	 * 原值:1084576613-->100 0000 1010 0101 0101 0011 0110 0101
	 * >>>32
	 * 运算后:1084576613-->100 0000 1010 0101 0101 0011 0110 0101
	 * 
	 * temp=32,打印结果: 
	 * 原值:1084576613-->100 0000 1010 0101 0101 0011 0110 0101
	 * >>>33
	 * 运算后:542288306-->10 0000 0101 0010 1010 1001 1011 0010
	 */

 

 

负数右移:

/**
	 * 无符号右移:负数
	 */
	@Test
	public void right3() {
		int temp = 32;
		String as = "-01000000101001010101001101100101";
		int an = Integer.parseInt(as, 2);
		System.out.println("原值:" + an + "-->" + Integer.toBinaryString(an));
		System.out.println(">>" + temp);
		int bn = an >>> temp;
		System.out.println("运算后:" + bn + "-->" + Integer.toBinaryString(bn));
	}
	
	/**
	 * temp=1,打印结果: 
	 * 原值:-1084576613-->1011 1111 0101 1010 1010 1100 1001 1011
	 * >>>1
	 * 运算后:1605195341-->101 1111 1010 1101 0101 0110 0100 1101
	 * 
	 * temp=2,打印结果: 
	 * 原值:-1084576613-->1011 1111 0101 1010 1010 1100 1001 1011
	 * >>>2
	 * 运算后:802597670-->10 1111 1101 0110 1010 1011 0010 0110
	 * 
	 * temp=31,打印结果: 
	 * 原值:-1084576613-->1011 1111 0101 1010 1010 1100 1001 1011
	 * >>>31
	 * 运算后:1-->1
	 * 
	 * temp=32,打印结果: 
	 * 原值:-1084576613-->1011 1111 0101 1010 1010 1100 1001 1011
	 * >>>32
	 * 运算后:-1084576613-->1011 1111 0101 1010 1010 1100 1001 1011
	 * 
	 * temp=33,打印结果: 
	 * 原值:-1084576613-->1011 1111 0101 1010 1010 1100 1001 1011
	 * >>>33
	 * 运算后:1605195341-->101 1111 1010 1101 0101 0110 0100 1101
	 * 
	 */

 

 最后一张总结图



 

 

 

  • 大小: 42.2 KB
分享到:
评论

相关推荐

    C 、JAVA 、C++ 、软件测试面试题

    在IT行业中,编程语言如C、Java和C++以及软件测试是至关重要的领域,它们各自拥有丰富的知识体系,且在实际工作和面试中都扮演着关键角色。下面将分别介绍这些知识点,帮助读者理解并应对相关面试题。 一、C语言 ...

    大数运算包含加,减,乘,除,取模,幂运算,模幂运算。支持十进制运算,二进制运算.zip

    大数运算库如Java的BigInteger和Python的decimal模块,可以提供不受限制的精度,确保计算结果的准确无误。 2. **加法与减法**:对于大数,基本的加减法操作需要考虑到进位和借位,尤其是在二进制表示下,这涉及到每...

    农行,笔试题,java,c

    9. Java 位移运算:&gt;&gt;&gt;运算符。 10. Java awt 包:用于 GUI 编程。 11. Java final 关键字:不可继承的类。 12. Java 系统输出:system.out.println()。 13. Java 面板默认布局:FlowLayout。 14. Java 类组成:属性...

    java版本DAM6080测平硐位移的完整代码

    Java版本的DAM6080测平硐位移程序是一个用于实时监测和记录矿井位移数据的应用。DAM6080设备通常用于地质测量,它具有多个传感器通道来收集不同位置的位移信息。这个程序的核心功能是定时接收来自DAM6080的7个通道的...

    c AES, c++ AES, java AES, 互通, 加密解密

    在实际应用中,你需要参考这些文件来编写和测试你的代码,确保在C、C++和Java之间可以正确地加密和解密数据。 总的来说,实现跨平台的AES加密解密需要深入理解AES算法本身,掌握C/C++和Java的底层机制,以及如何在...

    JAVA实现的VIgenere密码加密解密系统及唯密文破译

    在Java实现中,可能使用了ASCII码或者Unicode编码来表示字母,并通过计算字母的位移实现加密。 2. **Vigenere解密算法**: 解密Vigenere密码的过程与加密相反,需要将密文与相同的密钥进行相同的操作,但方向相反...

    浅谈java中的移动位运算:,&gt;&gt;&gt;

    Java中的移动位运算是一种在计算机科学中用于处理二进制数据的基本操作,它涉及到将一个数字的二进制表示向左或向右移动指定的位数。本文将深入探讨Java中的移动位运算符:`(左移运算符)、`&gt;&gt;`(有符号右移运算符...

    Java模拟计算机的整数乘积计算功能示例

    在计算机中,位移运算可以用来实现乘积计算。例如,我们可以将一个整数a看作二进制数,然后将其与另一个整数b进行位移运算,最后将结果累加起来。例如,我们可以将a看作二进制数1111,然后将其与b进行位移运算,最后...

    Test_shr_long.rar_verify

    在IT行业中,尤其是在...总的来说,“Test_shr_long.rar_verify”可能是一个关于Java位移操作的测试案例,特别是关注无符号右移的正确性和边界条件。通过理解和掌握这些知识点,开发者能更好地写出高效且可靠的代码。

    应用JAVA进行密码加密的一种算法

    然而,实际应用中,更推荐使用成熟的加密库,如Java的JCE(Java Cryptography Extension),它提供了更为强大和安全的加密算法,如AES(高级加密标准)和RSA(公钥加密标准)。这些算法不仅效率更高,而且安全性经过...

    BidInteger(java)

    在Java编程语言中,`BigInteger`是一个非常重要的类,它位于`java.math`包下,用于处理超过`long`类型所能表示的大整数。`BigInteger`类提供了无限制大小的整数运算,支持各种数学操作,如加法、减法、乘法、除法...

    空间后方交会java版

    空间后方交会(Space Rearrangement)是指通过已知地面控制点在图像上的投影坐标,反求摄影机在空间中的位置和姿态,即外方位元素,包括三个旋转参数(绕X、Y、Z轴的转角)和三个平移参数(沿X、Y、Z轴的位移)。...

    科学计算器JAVA.pdf

    开发者需具备基础的Java编程知识,理解面向对象编程,并对算术运算和逻辑运算有一定的了解。 二、综合训练任务 主要任务包括创建用户友好的图形界面,实现基本的加减乘除功能,以及高级的科学计算功能,如三角函数...

    java代码优化笔记

    乘除法运算中,如果可能,使用位移运算符替换乘除法,这在处理2的n次幂时尤其有效。对于循环结构,应当注意减少循环次数,比如通过减少变量读取次数、循环中避免嵌套循环以及循环外声明变量等方法来优化。 在字符串...

    基于Misty1算法的加密软件(JAVA)的实现

    - **线性和非线性变换**:通过数组操作实现,例如,行位移可以通过数组复制实现,列混淆通常涉及矩阵运算。 - **密钥扩展**:Misty1的密钥扩展需要将原始密钥扩展成多个轮密钥,这可以通过循环和异或操作完成。 -...

    2006年4月全国计算机等级考试二级JAVA笔试试题及答案.docx

    Java中的位移运算 题目给出的示例代码中,涉及到了位移运算。表达式 89 &gt;&gt; 1 的结果是 **A** 44。这是将89的二进制表示向右移动一位,相当于除以2。 ### 23. Applet中的绘图方法 题目提到,在Applet中显示文字、...

    基于Misty1算法的加密软件(JAVA)的实现(源代码+论文).zip

    Java中可以使用`Arrays.copyOfRange()`或自定义方法来实现位移,而列混淆可以通过特定的矩阵乘法来完成。 6. **轮密钥加**:每一轮结束后,需要将轮密钥加到状态矩阵上。轮密钥是根据主密钥生成的,通常需要进行...

    Java面试-对象,异常等.doc

    1. 十六进制字符串转整数:给定的代码使用位移运算实现,也可以使用`Integer.parseInt(str, 16)`方法,这是Java提供的内置转换函数,更加简洁。 2. 等额本息还款法:计算每月还款额涉及复利计算,代码中通过循环...

Global site tag (gtag.js) - Google Analytics