如何计算2的n次方

今天在写代码的时候,遇到了纹饰评分的计算,纹饰的等级和评分的关系为:

  • 1级纹饰:20
  • 2级纹饰:40
  • 3级纹饰:80

得出纹饰等级grade和纹饰评分score的关系:score = (2 ^ grade) * 10,所以就遇到了要求2的N次方的问题。

我的第一反应是java.util.Math有一个pow(a, b)方法,就是求a ^ b,但是由于很少用这个方法,居然参数是float类型的。(不知道java的作者为什么偷懒,不写几个重载的pow()方法)

于是只能另寻他法了,于是在百度的时候我突然想起了位运算,2是特殊的数字,一个数字要扩大2^N呗,只需要左移N位。

  • 2 << 1 = 4
  • 2 << 2 = 8
  • 2 << 3 = 16
  • ......

所以,上面的公式score = (2 ^ grade) * 10可以用java代码实现

int score = (2 << (grade - 1)) * 10;

当然,为了减少一次减法运算,可以再次简化公式:

int score = (1 << grade) * 10;

具体的业务代码为

/*
 * 2、纹饰评分
 */
// 统御状态为:1-统御中
if (TongyuState.YTY.getValue().equals(chongwu.getTyStatus())) {
   // 根据坐骑ID查询纹饰类型列表
   List list = wenshiMapper.selectByZuoqiId(chongwu.getZuoqiId());

   if (list.size() > 0) {
      // 遍历纹饰类型列表
      for (WenshiCategory wenshiCategory : list) {
         // 纹饰的评分 = 2^纹饰等级 * 10
         score.addAndGet((1 << wenshiCategory.getGrade()) * 10);
      }
   }
}

好了,文章就分享到这里了,看完如果觉得对你有所帮助,不要忘了点赞+收藏哦~

你可能感兴趣的:(java,开发语言)