美文网首页
Java算法中的 >>>1

Java算法中的 >>>1

作者: Jason_M_Ho | 来源:发表于2017-12-03 11:21 被阅读0次

经常在一些算法中看到 num >>> 1的写法,num >>> 1,相当于num除以2,为什么不直接写num除以2呢?因为计算机中的数据是以二进制的形式存储的,数学运算的加减乘除底层也是二进制移位实现的,直接在二进制上移位,显然要比数学运算来的更直接。
来看一下Java中的移位运算符,有三种:

<< : 左移运算符,num << 1,相当于num乘以2
>> : 右移运算符,num >> 1,相当于num除以2
>>> : 无符号右移运算符,num >>> 1,相当于num除以2,忽略符号位,空位都以0补齐
示例:

        int num = 8;
        int num1 = num << 1;  //num1 = 16
        int num2 = num >> 1 ;  //num2 = 4
        int num3 = num >>> 1;  //num3 = 4

注意:无符号右移运算符忽略了最高位的符号位,0补最高位,并且无符号右移运算符 >>> 只对32位和64位的数值有意义。Java中只有这三种位移,没有向左的无符号位移。

        int num = -8;
        int num1 = num << 1;  //num1 = -16
        int num2 = num >> 1 ;  //num2 = -4
        int num3 = num >>> 1;  //num3 = 21 4748 3644

为什么 num3 是 21 4748 3644 这么个数?因为数值在计算机中是以补码的形式的存储的,-8的补码是 [11111111 11111111 11111111 11111000],右移一位则变成了 [01111111 11111111 11111111 11111100],最高位的1表示负数,0表示正数,>>> 时0补最高位的符号位,[01111111 11111111 11111111 11111100] 的十进制就是21 4748 3644。在正数位移的时候,>>>>> 是一样的,在负数位移的时候就不一样了。

Java算法中的 >>>1 与 /2 是等效的,前者运算效率高,后者运算级别高。

相关文章

  • Java算法中的 >>>1

    经常在一些算法中看到 num >>> 1的写法,num >>> 1,相当于num除以2,为什么不直接写num除以2...

  • Java中的加密算法(二)

    1.对称加密算法1.1对称加密算法-DES 在Java中的加密算法(一)中主要讲解了密码中常用的术语,Java安全...

  • [Java]Java中的排序原来可以这么玩

    1. Java中的排序算法 讲Java中的集合排序前,我们来一起思考一下: 什么样的排序算法适合做为标准类库的算法...

  • Java 内存回收算法

    一、判断Java中对象存活的算法 1、引用计数器算法: Java 堆 中每个具体对象(不是引用)都有一个引用计数器...

  • HashMap中为什么数组的长度为2的幂次方

    Java中HashCode算法详解 Java中的集合,比如HashMap/HashSet/HashTable在实现...

  • Java技术书单

    算法/数据结构1.《算法(第4版)》2.《算法导论》3.《算法图解》 Java虚拟机《深入理解Java虚拟机》 并...

  • 第2章 字符串和日期

    1、字符串中A的数量 算法分析 直接模拟 时间复杂度 Java 代码 2、最长的名字 算法分析 直接模拟 时间复杂...

  • A*搜索算法(补充)

    在之前的文章A*搜索算法(Java实现)中,本人给大家介绍了A*搜索算法的算法流程以及附送了了一份本人用Java代...

  • Hash算法

    数据结构与算法分析:大纲数据结构:数组算法:hash算法算法:排序算法Java实现 1 Hash算法? 将任意长度...

  • 第24章 背包问题进阶

    1、整数划分 算法1 完全背包求方案数问题 时间复杂度 Java 代码 算法2 时间复杂度 Java 代码 2、猫...

网友评论

      本文标题:Java算法中的 >>>1

      本文链接:https://www.haomeiwen.com/subject/aadabxtx.html