精华内容
下载资源
问答
  • Java移位运算

    2018-08-23 17:19:28
    主要讲述Java移位运算,包括:基本数据类型范围、二进制的概念,移位运算符,基本数据类型与二进制之间的转换等。
  • java移位运算

    2020-12-01 21:21:25
    java移位运算 int A=60;//(即二进制00111100) 有符号数移位 “<<” 按位左移运算符, 左操作数按位左移右操作数指定的位数,将该数乘以2^n,n为移位的位数。 A << 2 //得到240,将00111100向左移两...

    java移位运算

    int A=60//(即二进制00111100)
    

    有符号数移位

    “<<” 按位左移运算符, 左操作数按位左移右操作数指定的位数,将该数乘以2^n,n为移位的位数。

     A << 2  //得到240,将00111100向左移两位,得到 1111 0000,即将60*2^2=240
    

    “>>” 按位右移运算符。左操作数按位右移右操作数指定的位数,即将该数除以2^n,n为移位的位数。

    A >> 2  //得到15,将00111100右移两位,得到 1111,即60/(2^2)=15;
    

    无符号数移位

    “>>>” 按位右移补零操作符。左操作数的值按右操作数指定的位数右移,移动得到的空位以零填充,原理与前面相同,但这是无符号数的操作。

    A>>>2  //得到15,将00111100右移两位,并在前面移动空位补零,得到0000 1111,60/(2^2)=15;
    
    展开全文
  • Java 移位运算详解

    2020-08-24 17:03:34
    当long类型进行左移操作时,long类型在二进制中的体现是64位的,因此求余操作的基数也变成了64,也就是说左移64位相当于没有移位,左移72位相当于左移8位(72%64=8) 注意:其它几种整形byte,short移位前会先转换为...

    个人网站:生命不息 折腾不止

    1、左移运算符:<<

    先随便定义一个int类型的数int,十进制的value = 733183670,转换成二进制在计算机中的表示如下:

    value << 1,左移1位

    左移1位后换算成十进制的值为:1466367340,刚好是733183670的两倍, 有些人在乘2操作时喜欢用左移运算符来替代。

    value << 8,左移8位看一下:

    左移8位后变成了十进制的值为:-1283541504,移动8位后,由于首位变成了1,也就是说成了负数,在使用中要考虑变成负数的情况。

    根据这个规则,左移32位后,右边补上32个0值是不是就变成了十进制的0了?答案是NO,当int类型进行左移操作时,左移位数大于等于32位操作时,会先求余(%)后再进行左移操作。也就是说左移32位相当于不进行移位操作,左移40位相当于左移8位(40%32=8)。当long类型进行左移操作时,long类型在二进制中的体现是64位的,因此求余操作的基数也变成了64,也就是说左移64位相当于没有移位,左移72位相当于左移8位(72%64=8)
    注意:其它几种整形byte,short移位前会先转换为int类型(32位)再进行移位。

    综上所述:左移 << 其实很简单,也就是说丢弃左边指定位数,右边补0。

    2、右移运算符:>>

    还是这个数:733183670

    value >> 1,右移1位

    右移1位后换算成十进制的值为:366591835,刚好是733183670的1半, 有些人在除2操作时喜欢用右移运算符来替代

    value >> 8,右移8位看一下

    和左移一样,int类型移位大于等于32位时,long类型大于等于64位时,会先做求余处理再位移处理,byte,short移位前会先转换为int类型(32位)再进行移位。以上是正数的位移,我们再来看看负数的右移运算,如图,负数intValue:-733183670的二进制表现如下图:

    右移8位,intValue >> 8

    综上所述:右移运算符>>的运算规则也很简单,丢弃右边指定位数,左边补上符号位。

    3、无符号右移运算符:>>>

    无符号右移运算符>>>和右移运算符>>是一样的,只不过右移时左边是补上符号位,而无符号右移运算符是补上0,也就是说,对于正数移位来说等同于:>>,负数通过此移位运算符能移位成正数。以-733183670>>>8为例来画一下图

    无符号右移运算符>>的运算规则也很简单,丢弃右边指定位数,左边补上0。

    4. 快速算出移位运算符结果的方法(只适用小数值):

    在不大于自身数值类型最大位数的移位时,一个数左移n位,就是将这个数乘以2的n次幂;一个数右移n位,就是将这个数除2的n次幂,然后取整。
    比如int32位的(64位也是同样方法):

    7 >> 1  = 7/2  取整为3
    7 << 1  = 7*2  为14
    

    如果移动位数超过了32位怎么办?把移位数和32取余数得到的数字套用即可:

    如 9 >> 67
    1、先67对32取余,结果是3
    2、然后9/8 得到结果为1

    展开全文
  • java移位运算详解

    千次阅读 2017-05-22 16:44:02
    java移位运算符有三种:(左移)、>>(带符号右移)和>>>(无符号右移)。 左移左移运算符 使指定值的所有位都左移指定的次数。 1)它的通用格式如下所示:value num 指定要移位值value 移动的位数。 左移的规则只...

    java移位运算符有三种:<<(左移)、>>(带符号右移)和>>>(无符号右移)。

    左移

    左移运算符 << 使指定值的所有位都左移指定的次数。

    1)它的通用格式如下所示:

    value << num
    num 指定要移位值value 移动的位数。
    左移的规则只须记住一点:丢弃最高位,0补最低位
    如果移动的位数超过了该类型的最大位数,那么编译器会对移动的位数取模。如对int型左移33位,实际上只移动了33%32=1位。

    2)运算规则

    按二进制形式把所有的数字向左移动对应的位数,高位移出(舍弃),低位的空位补零。
    当左移的运算数是int 类型时,每移动1位它的第31位就要被移出并且丢弃;
    当左移的运算数是long 类型时,每移动1位它的第63位就要被移出并且丢弃。
    当左移的运算数是byte 和short类型时,将自动把这些类型扩大为 int 型。

    3)数学意义

    在数字没有溢出的前提下,对于正数和负数,左移一位都相当于乘以2的1次方,左移n位就相当于乘以2的n次方

    4)计算过程:

    例如:3 <<2(3为int型)
    1)把3转换为二进制数字0000 0000 0000 0000 0000 0000 0000 0011,
    2)把该数字高位(左侧)的两个零移出,其他的数字都朝左平移2位,
    3)在低位(右侧)的两个空位补零。则得到的最终结果是0000 0000 0000 0000 0000 0000 0000 1100,
    转换为十进制是12。
    移动的位数超过了该类型的最大位数,
    如果移进高阶位(31或63位),那么该值将变为负值。下面的程序说明了这一点:

    // Left shifting as a quick way to multiply by 2.  
    
    // coding = java
    public class MultByTwo {  
    public static void main(String args[]) {  
       int i;  
       int num = 0xFFFFFFE;   
       for(i=0; i<4; i++) {  
           num = num << 1;   
         System.out.println(num);  
       }  
      }  
    }  

    该程序的输出如下所示:

    536870908
    1073741816
    2147483632
    -32
    注:n位二进制,最高位为符号位,因此表示的数值范围-2^(n-1) ——2^(n-1) -1,所以模为2^(n-1)。

    带符号右移

    右移运算符 >> 使指定值的所有位都右移规定的次数。

    1)它的通用格式如下所示:

    value >> num
    num 指定要移位值value 移动的位数。
    右移的规则只须记住一点:符号位不变,左边补上符号位

    2)运算规则:

    按二进制形式把所有的数字向右移动对应的位数,低位移出(舍弃),高位的空位补符号位,即正数补零,负数补1
    当右移的运算数是byte 和short类型时,将自动把这些类型扩大为 int 型。
    例如,如果要移走的值为负数,每一次右移都在左边补1,如果要移走的值为正数,每一次右移都在左边补0,这叫做符号位扩展(保留符号位)(sign extension ),在进行右移操作时用来保持负数的符号。

    3)数学意义

    右移一位相当于除2,右移n位相当于除以2的n次方。

    4)计算过程

    11 >>2(11为int型)
    1)11的二进制形式为:0000 0000 0000 0000 0000 0000 0000 1011
    2)把低位的最后两个数字移出,因为该数字是正数,所以在高位补零。
    3)最终结果是0000 0000 0000 0000 0000 0000 0000 0010。
    转换为十进制是3。

    35 >> 2(35为int型)
    35转换为二进制:0000 0000 0000 0000 0000 0000 0010 0011
    把低位的最后两个数字移出:0000 0000 0000 0000 0000 0000 0000 1000
    转换为十进制: 8

    无符号右移

    无符号右移运算符 >>>
    它的通用格式如下所示:
    value >>> num
    num 指定要移位值value 移动的位数。
    无符号右移的规则只记住一点:忽略了符号位扩展,0补最高位
    无符号右移运算符>>> 只是对32位和64位的值有意义
    参考

    展开全文
  • Java移位运算原理解析

    2019-03-19 16:48:35
    Java移位运算原理解析位运算引言位运算的优点是什么?什么是位运算?都有哪些位运算符有符号左移/右移详解移位运算符原理剖析无符号左移/右移插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个...

    位运算

    引言

    最近在为了面试做准备,一直想多了解一些Java底层的运行机制,偶然看到了移位运算符,虽然说在Java这种OOP语言中用的可能没有面向过程语言中用的频繁,但是技多不压身嘛,所以写下了这篇博文将知识分享给大家。

    位运算的优点是什么?

    位运算的优点就是大大的提高了程序的效率。

    什么是位运算?

    所有的数据在计算机内存中都是以二进制的形式存在的,通过使用位运算符可以直接操纵二进制数据,而且我们正常的运算符也是通过计算机通过位运算调用栈来实现,所以通过位运算符操纵数据可以节约计算机的内存,同时也大大的提高了程序的效率

    都有哪些位运算符

    有符号左移 和 右移 <<>>
    无符号左移 和 右移 <<<>>>

    有符号左移/右移详解

    让我们看一下此处的代码

    int a  =  12;
    int b = a >> 2;  	//有符号右移两位
    System.out.println(b);
    

    这里的输出结果是3,原理剖析如下。

    移位运算符原理剖析

    要想知道这个运算结果是怎么得来的,我们就要探究计算机存储数据的终极奥秘原码、反码和补码。

    原码为原数据的直接二进制数的表示。

    例如byte类型数据12的原码是00001100
    例如byte类型数据-12的原码是10001100

    反码,正数的反码和原码相同,负数的反码是除符号位(二进制的第一位表示符号为,0为正1为负)原码按位取反得来的。

    例如byte类型数据12的反码是00001100
    例如byte类型数据-12的反码是11110011

    补码,正数的补码和原码相同,负数的补码是反码+1,补码进行反码+1就是原码。
    例如byte类型数据12的补码是00001100
    例如byte类型数据-12的补码是11110100

    总结,计算机存储数据用的是补码,计算的任何结果都是补码,需要转换骋原码才可以进行进制换算。

    我们例子中给出的变量aint类型的,在我第一篇博文《浅谈Java变量和数据类型》
    中提到,int类型的数据占用32位储存空间,所以我们变量a的原码一定是32位的二进制数据。
    00000000 00000000 00000000 00001100 //12的原码
    由于正数的原码、反码、补码都相同,所以可得12的补码是
    00000000 00000000 00000000 0000100//12的补码
    有符号右移N位,在符号位后自动补N个0(正数)或1(负数 )
    0 ==00== 00000000 00000000 00000000 00011//左边的两个0为右移后补全的0
    再将此二进制数据转换成十进制的数据,就是我们上面的运算结果3

    如果说负数右移两位呢?代码如下

    int a = -12;
    int b = -12 >> 2;
    System.out.println(b);
    

    结果是==-3==
    10000000 00000000 00000000 00001100//第一位是符号位。-12的原码
    11111111 11111111 11111111 11110011//-12的反码
    反码+1求补码
    11111111 11111111 11111111 11110100//-12的补码
    开始右移,右边末端去掉n位数,因为是有符号,所以默认在符号位后补2个1
    11 11111111 11111111 11111111 111101//移动后的-12补码
    10 00000000 00000000 00000000 000010//反码
    反码+1
    10 00000000 00000000 00000000 000011 //结果 -3

    左移原理与右移原理相同啦

    无符号左移/右移

    无符号的移位运算符与有符号的移位运算符原理上大体相同啦,区别就是在有符号移位运算中,我们所补全的数字是取决于符号位(符号位是0就补0,是1就补1),但是在无符号的移位运算中,不管是正数还是负数,都补0。

    例如
    10000000 00000000 00000000 00001100//第一位是符号位。-12的原码
    11111111 11111111 11111111 11110011//-12的反码
    反码+1求补码
    11111111 11111111 11111111 11110100//-12的补码
    开始右移,右边末端去掉n位数,因为是有符号,所以默认在符号位后补2个1
    00 11111111 11111111 11111111 111101//移动后的-12补码,同时也是原码,因为是正数
    因为第一位是0,表示正数,正数的原码、反码、补码是完全相同的,所以结果用计算机换算得来是1073741821

    有的同学可能在这里就产生疑问了
    说,你这个-12的补码移位之后不是应该换回原码吗?但是请各位看仔细,因为我是无符号右移,所以我前面默认添了0,这个数就由负数变成正数了,而正数的原码反码补码都相同,所以说结果不用继续换算啦。

    左移原理也相同哈

    结束语

    写于2019.3.19,中软基地。
    最大的感受是经过这一系列的培训,对于Java底层原理兴趣越来越浓厚。

    展开全文
  • Java并发编程是整个Java开发体系中最难以理解,但也是最重要的知识点之一,因此学习起来比较费劲,从而导致很多人望而却步,但是无论是职场面试还是高并发高流量的系统的实现都离不开并发编程,能够真正掌握并发编程...
  • Java 移位运算(、>>、>>>)

    千次阅读 2016-05-13 16:32:44
    Java位移运算主要有三种: (1)左移: vluse 规则: 1)丢弃最高位,低位补0; 2)如果移动位数超过了该类型的最大位数,那么编译器会对移动的位数取模操作; 3)在没有溢出的情况下,对于正数和负数都相当于乘2...
  • Java移位运算的应用

    2019-07-31 01:50:16
    大家都知道计算机最擅长的就是计算,但是你知道计算机是如何...如果我们用移位运算这个式子 324364657365 * 10亿 最多需要 31 次的加法运算,计算量从 10亿 次瞬间减低到了 31 次,运算速度不知道快了多少倍!!!!
  • java 移位运算

    2020-01-17 11:25:18
    1、算术移位(>>)和逻辑移位(>>>) 算数移位考虑符号位 逻辑移位不考虑符号位 2、左移n位 定义:(比较繁琐,不建议看) 用来将一个数的各二进制位全部左移若干位,移动的位数由右操作数指定,右操作数...
  • java中的移位运算

    千次阅读 2019-06-02 23:18:57
    java中的移位运算符 <...移位运算相比于单纯的乘除法运算,移位运算要快得多。 如下: a×100和b左移运算的的结果如下 a÷16和b右移运算的的结果如下 移位运算优势是快,但是缺点也很明显...
  • Java移位运算

    万次阅读 2017-07-09 15:59:13
    以前一直没有研究二进制的移位运算的应用场景是什么,怎么运算?怎么实现数据的四则运算的? 直到最近,在看Think in Java的书籍,才真正理解这个东西。下面记录一下学习笔记。 1,二进制1.1 二进制的表示我们知道...
  • Java 移位运算( >>、>>、>>>)

    千次阅读 2018-07-28 17:53:15
    转载自:[原文]... Java 移位运算(&amp;amp;amp;lt;&amp;amp;amp;lt;、&amp;amp;amp;gt;&amp;amp;amp;gt;、&amp;amp;amp;gt;&amp;amp;amp;gt;&amp;amp;amp;gt;)
  • 在解决这个问题的时候,碰到了Java移位运算,这里写一点简单的理解: 前提:在不考虑 数值符号 和 数值范围 的情况下(正数), 可以简单地认为:左移就是乘于2的n次方,右移就是除以2的n次方,注意 int ...
  • 今天小编就为大家分享一篇关于Java利用移位运算将int型分解成四个byte型的方法,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
  • 普遍都是这样认为的:如果左侧操作数是int类型,会对右侧操作数进行除数为32的求余运算,如果左侧操作数为long类型,会对右侧操作数进行除数为64的求余运算。是的,当要移位的个数为正数时是这样的,但当要移位的...
  • 从表面上看似乎有点像逻辑运算符,但逻辑运算符是针对两个关系运算符来进行逻辑运算,而位运算符主要针对两个二进制数的位进行逻辑运算,想要准备理解本节内容的话需要对二进制有基本的只是,如果你不是的话请出门左...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 21,787
精华内容 8,714
关键字:

java移位运算

java 订阅