“求余”

本文介绍了位运算的基础概念及其实用场景,通过具体的例子展示了如何利用位运算提高程序效率,比如快速计算数组中特定元素的颜色。此外还对比了位运算与传统取余操作的区别及其在实际开发中的应用。

基础:

int length = 4;

定义长度为4(2^n),那么任何一个数如何使4的整数倍:则可以得出如下结论:

int b = 1....100;

即转换成2进制后最后两(n)位必定为0;

length-1=01111....1;

那么b&(length-1)即b的最低n位,也就是余数


假如有这么一种需求:

    发表博客添加标签,根据标签id设置标签显示不同颜色!

设计思路如下:

  •     先定义颜色数组:

String []colorArray={"blue","red","black","pink"};
  • 获取标签id

int id=100;
  • 获取数组长度

int size = colorArray.length;
  •     获取颜色:

  • 第一种方法:

String color = colorArray[id%size];
  • 第二种方法

String color = colorArray[id&(size-1)];
  1. 以上两种方法都可以取出所对应颜色

  2. 第一种方法是传统取余

  3. 第二种方法是采用交集方式,位运算,变相取余,效率高,结果等同于求余

  4. 第二种方式是在hashmap源码时看到的:获取数组索引

static int indexFor(int h, int length) {
    // assert Integer.bitCount(length) == 1 : "length must be a non-zero power of 2";
    return h & (length-1);
}



个人博客:http://www.whereta.com

转载于:https://my.oschina.net/vincentzhao/blog/660741

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值