参考链接: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 * */
最后一张总结图
相关推荐
因为Java 使用2的补码来存储负数,并且因为Java 中的所有整数都是有符号的,这样应用位运算符可以容易地达到意想不到的结果。例如,不管你如何打算,Java 用高位来代表负数。为避免这个讨厌的意外,请记住不管高位的...
简单小工具,输入十进制数值计算结果,C# WINFORM版,非源码
Java位运算操作 左位移 右位移 与或非的操作
计算机组成原理 带位移运算模型机的设计与实验:包括实验要求,内容,步骤,总结等。。。
java基本类型转byte,设计原码、补码、反码、左右位移等知识,赚点积分
半导体工艺原理实验。实验五:光纤位移传感器-位移测试实验
指针,算术,位移运算开发包部份示例代码[AsmInVB].
介绍了推进机构的结构组成和工作原理,指出无法采用内置位移传感器测量...介绍了推进机构位移间接测试系统的结构组成和测算原理,详细分析了测试系统的误差来源及其分类。基于这些分析,提出了减小测试系统误差的措施。
2 到 64 之间的任意进制: $((BASE#NUMBER)) echo $((8#377)) echo $((16#D8)) 在 Shell 中进行进制转换的另一个诀窍是使用 bc, 它是一种任意精度运算语言,大多数 UNIX 安装程序都提供。因为它允许您指定输出进制...
绝对韩顺平老师的讲解视频!教学文件打包太大,就一个一个的上传了! avi格式的,最好用KMPlayer来播放,下载地址:https://www.kmplayer.com/home 后续还上传,韩顺平老师教学的源代码!
这是一个关于测试C语言中整数移位运算的MFC应用程序,界面中标志表示左移或者右移,移位数输入要移的位数,还有输入整数,和输出结果,按钮是用来操作,很方便用来测试
本资料集为C语言进阶学习者提供了全面的预处理、文件处理、结构体和位移运算的知识。内容涵盖了从基础语法到高级应用的各个方面,旨在帮助学习者深入理解C语言的核心概念和技术细节。 适用人群 本资料适合具有C语言...
Java对byte 的 + – * / >> >>> << & | ^ (加,减,乘,除,右移,左移,无符号右移,位与,位或,位异或)操作,均会是首先将byte转化为int, 再行运算。这一事实可能导致多种问题: 假设我们想进行如下...
日前,北京中科泛华测控技术有限公司(以下简称“泛华测控”)研发设计了传感器测试系列的又一新品——智能角位移传感器测试系统。该系统是泛华测控继“智能直线位移传感器标定与测试平台”后在智能位移传感器领域的...
电容式传感器的位移特性实验实验报告 电容式传感器 位移特性
动物位移小游戏Java实现,强行使用上了SQLite和MyBatis.zip动物位移小游戏Java实现,强行使用上了SQLite和MyBatis.zip动物位移小游戏Java实现,强行使用上了SQLite和MyBatis.zip动物位移小游戏Java实现,强行使用上...
计算过程中运用了矩阵相乘、矩阵求逆(高斯消元)等方法,针对特定一类题目正确求解。代码内有详细注释,希望对大家有所帮助
VOLFA modbus输出位移传感器 测试,设定软件操作说明pdf,VOLFA modbus输出位移传感器 测试,设定软件操作说明
不错的主要用于加密的vbs(asp)位移运算类
文中主要讲解了负数移位的实现过程。