zoukankan      html  css  js  c++  java
  • 用Java计算x的y次幂x^y以及位运算计算2^n

    简介

    我们知道 (x^y) 表示 x的y次幂。特殊地,(2^n) 表示 2的n次方,或者叫 2的n次幂

    1.计算 x 的 y次幂

    易踩坑1:x ^ y

    × 之前,在刷算法题时,需要计算 x的y次幂的结果。我们经常用 x^y 在计算机上书面的表示公式 (x^y)。于是,我掉进了第一个陷阱!

    public class Main {
      public static void main(String[] args) {
        System.out.println(2 ^ 2); // 输出结果为0
      }
    }
    

    在 Java 中,^ 是异或计算符号,而n次幂的计算符号!

    异或运算是一种逻辑运算。如果a、b两个值不相同,则异或结果为1。如果a、b两个值相同,异或结果为0。

    a b a ^ b
    0 0 0
    0 1 1
    1 0 1
    1 1 0

    进行异或运算时,首先将左操作数和右操作数转换为二进制数,然后对每一个二进制位分别进行异或计算。

    正确的方法是使用 Math.pow 函数。

    public class Main {
      public static void main(String[] args) {
        System.out.println(Math.pow(2, 2); // 输出结果为4
      }
    }
    

    Math 的返回值是 double,其范围是可以覆盖 long 和 int 的表示范围的!

    关键字 所占位数 范围
    int 32 (-2^{31}) ~ 2 ^{31} - 1
    long 64 (-2^{63}) ~ 2 ^{63} - 1

    2.用位运算计算 2 ^ n

    比如我想要计算 2 ^ 2,用位运算就是 1 << 2

    public class Main {
    
      public static void main(String[] args) {
        System.out.println(1 << 2); // 输出结果为 4,正确
      }
    }
    

    但是我在学习一致性Hash时,涉及到 (2^{32}-1) 的结果运算。

    易踩坑: 1 << 32

    × 直接用 (1 << 32) - 1 计算我想要的值

    public class Main {
    
      public static void main(String[] args) {
        System.out.println(1 << 32);  // 输出结果为1
        System.out.println((1 << 32) - 1); // 输出结果为0
      }
    }
    

    因为1左移32位,超出了 int 的表示范围

    正确的方法是使用 long 作为被除数。

    public class Main {
    
      public static void main(String[] args) {
        System.out.println(1L << 32);  // 输出结果为4294967296,正确
        System.out.println(new BigDecimal(2).pow(32)); // 输出结果为4294967296,正确
      }
    }
    

    long value = (1L << 32) - 1; // 结果为 4294967295

  • 相关阅读:
    ASP.NET 4.0 与 Entity Framework 4第一篇采用ModelFirst 开发方式创建数据库
    Web SSH 客户端Ajaxterm安装
    新浪微博Wordpress插件博客微博安装手册
    Sharetronix 微博客系统安装手册
    ASP.NET 4.0 与 Entity Framework 4第三篇使用Entity Framework调用存储过程
    QQ概念版体验[多图]
    您博客应该有的8个设计要素
    Centos 系统更新Python
    每天一个linux命令(28):tar命令
    C# 类(5) 重载
  • 原文地址:https://www.cnblogs.com/kendoziyu/p/14842260.html
Copyright © 2011-2022 走看看