zoukankan      html  css  js  c++  java
  • 关于java中位运算的左移、右移、无符号右移

    今天学到了java中的位运算,和C语言还是有所不同的:

    << :左移运算符,num<<1,相当于num*2;

    >>:右移运算符,num>>1,相当于num/2;

    >>>:无符号右移,忽略符号位,空位以0补齐。

    位运算的一些规则:


    1.byte、short、char在做移位运算之前,会被自动转换为int类型,然后再进行运算。
    2.byte、short、int、char类型的数据经过移位运算后结果都为int型。
    3.long经过移位运算后结果为long型。
    4.在左移位(<<)运算时,如果要移位的位数大于被操作数对应数据类型所能表示的最大位数,那么先将要求移位数对该类型所能表示的最大位数求余后,再将被操作数移位所得余数对应的数值,效果不变。比如1<<35=1<<(35%32)=1<<3=8。
    5.对于有符号右移位(>>)运算和无符号右移位(>>>)运算,当要移位的位数大于被操作数对应数据类型所能表示的最大位数时,那么先将要求移位数对该类型所能表示的最大位数求余后,再将被操作数移位所得余数对应的数值,效果不变。。比如100>>35=100>>(35%32)=100>>3=12。

    因为如果移位的位数超过了该类型的最大位数,那么有效信息就全没了,这种移位是毫无用处的。

    而对于无符号右移的一个应用场景:

    对01111100 11100010 00101111 10101010,按照四位取值,此时需要用到右移和按位与,此时不适合使用>>,而应该使用>>>,因为如果是负数的话,>>就不会不断移入有效位,而使用>>>等全移入0时可知数据全部移动完毕(该应用场景有可能有疏漏),而且经常会使用的是无符号右移。


    对变量进行位运算不会改变变量的值,除非是复合赋值表达式。

    另外,位预算对非2的模、幂场景不适用


    参考来源:关于java中char,byte,short的移位操作

                      [原]java 无符号右移

                      关于java按位操作运算


  • 相关阅读:
    CF710F String Set Queries AC自动机 二进制分组
    类欧几里得学习笔记
    P2053 [SCOI2007]修车 网络流
    螺旋方阵
    灯的排列问题
    编码问题
    论文阅读博客模板
    论文阅读框架模板
    动作识别论文20191104_Probabilistic selection of frames for early action recognition in videos
    剑指offer 57. 数字序列中某一位的数字
  • 原文地址:https://www.cnblogs.com/JSD1207ZX/p/9386251.html
Copyright © 2011-2022 走看看