hash及位运算

  • hash

也叫哈希、散列。是吧任意长度的输入通过散列算法变为固定长度的输出,是一种压缩算法,容易产生hash冲突。

哈希冲突的解决办法主要有三种:

  • 开放寻址
  • 再哈希。当发生冲突时,使用第二个、第三个、哈希函数计算地址,直到无冲突时。缺点:计算时间增加。
  • 链地址法。将所有关键字为同义词的记录存储在同一线性链表中。java hashmap使用的就是拉链法解决hash碰撞。

相同hash值的元素用链表串起来。ConcurrentHashMap就是采用的链地址法。

 

  • 位运算

以下下二进制左侧全是0的我就忽略不写了。二进制最高位0表示正数,1表示负数。

  • 十进制、二进制互转

十进制采用除2取余,逆序排列,就可以得到二进制。

右到左用二进制的每个数乘以2的相应次方,相加的总和就是十进制

将十进制20转为二进制                        二进制10100转十进制()
20/2= 10 ------0                           0 * 2º =0 +
10/2= 5 -------0                           0 * 2¹ =0 +
5/2= 2 --------1                           1 * 2² =4 +
2/2= 1 --------0                           0 * 2³ =0 +
1/2=0 ---------1                           1 * 2⁴ =16
最终结果为 10100                            最终结果为20
  • 有符号左移(<<)

将一个数的二进制位全部左移N位,右侧补0,左侧丢弃。简单可以理解为乘以N,3<<1,3<<2,3<<3相当于 3 * 2,3*2²,3*2³。

例如3转为二进制是11,3<<1,变为 1100,1100转为二进制是6。

  • 有符号右移(>>)

将一个数的二进制位全部右移N位,左侧补0。简单可以理解为除以N。

例如4转为二进制是100,4>>1,变为 10,10转为二进制是2
    5转为二进制是101,5>>1,变为 10,10转为二进制是2

  • 按位或(|)

只要有一个为1就为1.

2的二进制 10
3的二进制 11
结果为3   11
  • 按位与(&)

二进制各位比较,只要有一个为0,就为0。

2的二进制 10
3的二进制 11
结果为2   10
  • 按位异或(^)

二进制各位比较,不同为1,相同为0。

2的二进制 10
3的二进制 11
结果为1   01
  • 使用场景

位运算可以用在权限控制、商品属性等上面。在这些场景里可以很方便的查看用户拥有的权限或者物品拥有的属性。

    // 查询权限 1
    private static final int SELECT = 1 << 0;
    // 新增权限 2
    private static final int INSERT = 1 << 1;
    // 修改 4
    private static final int UPDATE = 1 << 2;
    // 删除 8
    private static final int DELETE = 1 << 3;
    // 拥有的权限
    private static int permissions;

    public static int getPer() {
        return permissions;
    }
    // 设置用户权限
    public static void setPer(int newPer) {
        permissions = newPer;
    }
    // 添加用户权限
    public static void addPer(int newPer) {
        permissions = permissions | newPer;
    }
    // 删除用户权限
    public static void delPer(int newPer) {
        permissions = permissions &~ newPer;
    }
    // 判断是否拥有某个权限
    public boolean isAllow(int per) {
        return (permissions & per) == per;
    }
    // 判断没有的权限
    public boolean isNotAllow(int per) {
        return ((permissions & per)==0);
    }

    public static void main(String[] args) {
        PermissionsDemo permission = new PermissionsDemo();
        permission.addPer(SELECT);
        permission.addPer(UPDATE);
        permission.delPer(UPDATE);
        permission.delPer(UPDATE | SELECT);
        System.out.println("select = "+permission.isAllow(SELECT));
        System.out.println("update = "+permission.isAllow(INSERT));
        System.out.println("insert = "+permission.isAllow(UPDATE));
        System.out.println("delete = "+permission.isAllow(DELETE));
    }

 

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值