`
kanpiaoxue
  • 浏览: 1744783 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

Java 位移运算符

阅读更多

 

参考文章:

1、【精华】https://zhuanlan.zhihu.com/p/30108890

2、【精华】https://baike.baidu.com/item/%E7%A7%BB%E4%BD%8D%E8%BF%90%E7%AE%97%E7%AC%A6

 3、https://juejin.cn/post/6844903783307149319

 

public static void test() throws Exception {

    int intValue = 5;// 随意写一个数
    /**
     * 数学意义:
     * 在数字没有溢出的前提下,对于正数和负数,左移一位都相当于乘以2的1次方,左移n位就相当于乘以2的n次方。
     * java 的 int 的位移操作:
     * 根据这个规则,左移32位后,右边补上32个0值是不是就变成了十进制的0了?
     * 答案是NO,当int类型进行左移操作时,左移位数大于等于32位操作时,会先求余(%)后再进行左移操作。
     * 也就是说左移32位相当于不进行移位操作,左移40位相当于左移8位(40%32=8)。
     * java 的 long 的位移操作:
     * 当long类型进行左移操作时,long类型在二进制中的体现是64位的,因此求余操作的基数也变成了64,
     * 也就是说左移64位相当于没有移位,左移72位相当于左移8位(72%64=8)
     * 
     * <pre>
     * ==== 左移:
     *  数学意义:
     *   在数字没有溢出的前提下,对于正数和负数,左移一位都相当于乘以2的1次方,左移n位就相当于乘以2的n次方。
     *   value << n 等于 value * Math.pow(2, n) 【注意】Math.pow(double, double) 是double操作
     *   如: 7 << 3 == 56 ,对比 7 * Math.pow(2, 3) = 56.0
     * 溢出情况:
     * java 的 int 的位移操作:
     * 根据这个规则,左移32位后,右边补上32个0值是不是就变成了十进制的0了?
     * 答案是NO,当int类型进行左移操作时,左移位数大于等于32位操作时,会先求余(%)后再进行左移操作。
     * 也就是说左移32位相当于不进行移位操作,左移40位相当于左移8位(40%32=8)。
     * java 的 long 的位移操作:
     * 当long类型进行左移操作时,long类型在二进制中的体现是64位的,因此求余操作的基数也变成了64,
     * 也就是说左移64位相当于没有移位,左移72位相当于左移8位(72%64=8)
     * 
     * ==== 右移:
     * 数学意义:
     *  右移一位相当于除2,右移n位相当于除以2的n次方。
     *  value >> n 等于 value / Math.pow(2, n)
     *  如:8 >> 3 == 1 ,对比 8 / Math.pow(2, 3) = 1.0
     * 溢出情况:
     *  和左移一样,int类型移位大于等于32位时,long类型大于等于64位时,会先做求余处理再位移处理,byte,short移位前会先转换为int类型(32位)再进行移位。
     * 
     * </pre>
     */
    System.out.println("intValue:" + (intValue));// 打印intValue
    System.out.println("intValue左移1位:" + (intValue << 1));// 左移1位
    System.out.println("intValue左移8位:" + (intValue << 8));// 左移8位
    // 当int类型左移位数大于等于32位操作时,会先求余后再进行移位操作
    System.out.println("intValue左移32位:" + (intValue << 32));// 求余为32%32=0,相当于左移0位(不移位)
    System.out.println("intValue左移40位:" + (intValue << 40));// 求余为40%32=8,相当于左移8位
    System.out.println("intValue左移64位:" + (intValue << 64));// 求余为64%32=0,相当于左移0位(不移位)

    long longValue = 5L;
    System.out.println("longValue:" + (longValue));// 打印longValue
    System.out.println("longValue左移1位:" + (longValue << 1));// 左移1位
    System.out.println("longValue左移8位:" + (longValue << 8));// 左移8位
    // 当long类型左移位数大于等于64位操作时,会先求余后再进行移位操作
    System.out.println("longValue左移64位:" + (longValue << 64));// 求余为64%64=0,相当于左移0位(不移位)
    System.out.println("longValue左移72位:" + (longValue << 72));// 求余为72%64=8,相当于左移8位
    System.out.println("longValue左移128位:" + (longValue << 128));// 求余为128%64=0,相当于左移0位(不移位)

    System.out.println(String.format("%s == %s", 7 << 3, 7 * Math.pow(2, 3)));
    System.out.println(String.format("%s == %s", 8 >> 3, 8 / Math.pow(2, 3)));

}

 

 

左移运算符(<<)规则编辑:

数学意义:

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

 

右移运算符(>>)规则:

数学意义:

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

 

无符号右移运算符(>>>)规则:

    按二进制形式把所有的数字向右移动对应位数,低位移出(舍弃),高位的空位补零。对于正数来说和带符号右移相同,对于负数来说不同。

分享到:
评论

相关推荐

    基本语法.png

    Java基础:运算符、算数运算符、赋值运算符、关系运算符、逻辑运算符、条件运算符、位移运算符、条件运算符、下标运算符;整型字面量、浮点字面量、字符字面量、 布尔型字面量、引用字面量、类型字面量

    JAVA基础之java的移位运算

    因为Java 使用2的补码来存储负数,并且因为Java 中的所有整数都是有符号的,这样应用位运算符可以容易地达到意想不到的结果。例如,不管你如何打算,Java 用高位来代表负数。为避免这个讨厌的意外,请记住不管高位的...

    学通Java的24堂课

    3.8.6 基本功训练6——位移实现数字乘以2的8次幂 86 3.9 情景应用——拓展与实践 86 3.9.1 情景应用1——输出长方形面积 86 3.9.2 情景应用2——输出字节bit位的值 87 3.9.3 情景应用3——判断奇偶数 88 3.9.4 ...

    21天学通Java-由浅入深

    ”:非运算符 54 3.4.4 逻辑运算符总结 54 3.5 三元运算符 55 3.6 位运算符 55 3.6.1 “&”:按位与运算符 56 3.6.2 “|”:按位或运算符 56 3.6.3 “^”:按位异或运算符 57 3.7 位移运算符 57 3.7.1 “&gt;&gt;”:带...

    java编程基础,应用与实例

    3.7.6 位移(shift)运算符(、、) 29 3.7.7 关系运算符(、、=、=、==、!=) 31 3.7.8 快速逻辑与(&&)和快速逻辑或(||) 32 3.7.9 位运算符:位与(&)、位或(|)、位异或(^) 34 3.7.10 三目运算符(?:) 35 3.7.11...

    java从入门到精通视频教程(全94讲)学习笔记整理(齐全).docx

    -运算符.流程控制 -.流程控制 -类.对象 -成员属性.成员方法 -成员方法.构造方法 -this.类变量 -类方法、封装 -访问修饰符.重载.覆盖 -约瑟夫问题 -多态 -抽象类、接口 -final.作业评讲 -作业、测试题 -数组 -排序、...

    java位运算加密示例

    通过位运算中的"^"异或运算符把字符串与一个指定的值进行异或运算,从而改变字符串每个字符的值,这样就可以得到一个加密后的字符串

    javascript基本语法

    :)、位移运算符(|,&,&lt;&lt;,&gt;&gt;,~,^)和字符串运算符(+)。 可能很多人不知道”===”是什么。 在这里,我为大家解释一下,在javascript中,“==”是等同运算符。 等同运算符的比较规则: 当两个运算数的类型不同时:...

    JavaScript基础和实例代码

    2.7.4 位移运算符 2.7.5 自加和自减 2.7.6 比较运算符 2.7.7 逻辑运算符 2.7.8 逗号运算符 2.7.9 空运算符 2.7.10 ?...:运算符 2.7.11 对象运算符 2.7.12 typeof运算符 2.7.13 运算符优先级 2.8 核心语句 2.8.1 基本...

    源文件程序天下JAVASCRIPT实例自学手册

    2.7.4 位移运算符 2.7.5 自加和自减 2.7.6 比较运算符 2.7.7 逻辑运算符 2.7.8 逗号运算符 2.7.9 空运算符 2.7.10 ?...:运算符 2.7.11 对象运算符 2.7.12 typeof运算符 2.7.13 运算符优先级 2.8 核心语句 2.8.1 基本...

    最新JAVA编程题全集_50题及答案

    import java.util.ArrayList; import java.util.List; public class NumTest { public static void main(String[] args) { String s="ABCD";//原字符串 List&lt;String&gt; result = list(s, "");//列出字符的...

    PL/SQL 基础.doc

    1) 运算符 + - * / **(指数操作符) 2) 关系 =(相当于JAVA中的==) &gt; &lt; &lt;&gt; != ~= ^= &lt;= &gt;= 3) 赋值 := 例子a:=2 4) 连接 || 例: 'abc' || 123 5) 标号 需要的标记 &gt;&gt; 6) 注释 --(单行) /* */(段落) 7) 替代...

    Oracle SQL高级编程(资深Oracle专家力作,OakTable团队推荐)--随书源代码

    10.4.3 CONNECT_BY_ROOT运算符 281 10.4.4 CONNECT_BY_ISCYCLE伪列和NOCYCLE参数 284 10.4.5 CONNECT_BY_ISLEAF伪列 287 10.5 小结 291 第11章 半联结和反联结 292 11.1 半联结 292 11.2 半联结执行计划 300 ...

Global site tag (gtag.js) - Google Analytics