小技巧 && 算法 浅谈

位运算

位运算符的分类及其定义
  • 与运算符&: 既二进制情况下,2者都为1才都为1 1101 & 0011=0001(按位与)
  • 或运算符|: 既二进制情况下,2者有一个为1就是1 如 1011| 0010=1011 (按位或)
  • 异或运算符^: 既二进制个情况下,相同则为0,否则为1,如1111 ^ 0010=1101 (按位异或)
  • 作用:
    • 因为计算机都是二进制数据,而通常位运算会被正常的逻辑运算符快,因而性能上会有少许的提升(如&代替%)

    • 并且可以减少内存,完全可以用位置上的值代替某种状态

    • 使用场景:

      • 非常适合于累加状态的判断,添加,删除,修改都非常方便,也就是说非常适合于权限等功能

          • 如 有状态 add=1 delete=2 update=4
          • 则完全可以通过位运算来实现功能的累加
      • 添加: 通过 | 运算符 : a=0 a | b 则b 的可能即可被添加到a上 ,0 | 1=0001 添加了add

      • 删除: 通过异或运算符 ^: a ^ b 则会在a中删除b的功能 0111 ^ 0010 = 0101 删除了delete

      • 判断: 通过&运算符: a & b 即可判断是否存在功能b 0111 & 0100 =0100 >0 判断delete功能是否存在
        # 位运算

  • 可以通过 位运算达到简化多重if else

    • // @我的  0000 0001  1
      	MSG_CATEGORY_AT = 1
      	// 私信   0000 0010 2
      	MSG_CATEGORY_PRV = MSG_CATEGORY_AT << 1
      	// 赞    0000 0100 4
      	MSG_CATEGORY_APPROVE = MSG_CATEGORY_PRV << 1
      	// 回复   0001 0000 8
      	MSG_CATEGORY_REPLAY = MSG_CATEGORY_APPROVE << 1
      	// 系统通知 0010 0000 16
      	MSG_CATEGORY_SYSTEM_NOTIFY = MSG_CATEGORY_REPLAY << 1
      	// 最大值
      	MSG_CATEGORY_MAX = MSG_CATEGORY_AT | MSG_CATEGORY_PRV | MSG_CATEGORY_APPROVE | MSG_CATEGORY_REPLAY | MSG_CATEGORY_SYSTEM_NOTIFY
      
    • for i:=8;i>0;i>>=1{
      	if i&k>=k{
      		params=append(params,i)
      	}
      }
      这样就可以直接sql 中来个in查询啦
      
  • 范围类型的定义可以由小到达的顺序:

    • // 范围最小的type 点对点
        	MSG_TYPE_BETWEEN_USER=1
        
        	// 000000000 00000000 00000000 10000001  & 这个表明发送的都是群组信息
        	MSG_TYPE_BASE_GROUP = MSG_TYPE_BETWEEN_USER << 7|MSG_TYPE_BETWEEN_USER
        	// 群组发送 000000000 00000000 11000000 00000001
        	MSG_TYPE_PLAT_USER_GROUP = MSG_TYPE_BASE_GROUP | MSG_TYPE_BASE_GROUP<<1
       	 // 全站 用户 00000000 00000000 10000000 00000001
        	MSG_TYPE_BASE_FULL_SITE= MSG_TYPE_BETWEEN_USER<<15 | MSG_TYPE_BETWEEN_USER
        	// 平台公告 00000000 00000001 10000000 00000001
        	MSG_TYPE_PLAT_ANNOUNCEMENT = MSG_TYPE_BASE_FULL_SITE | MSG_TYPE_BASE_FULL_SITE<<1
        	// 活动通知 00000000 00000010 10000000 00000001
        	MSG_TYPE_PLAT_EVENT_NOTICE = MSG_TYPE_BASE_FULL_SITE | MSG_TYPE_BASE_FULL_SITE<<2
      
    • 再在判断中以由大到小的顺序判断:


  • << : 二进制的形式,往左移动,正数用0负数用1补齐,右边用0补齐 ,相当于*2
  • : 二进制的形式右移1位,高位,正数用0负数用1补齐,相当于除以2


if req.MessageType&constants.MSG_TYPE_BASE_FULL_SITE >= constants.MSG_TYPE_BASE_FULL_SITE {
  
}else if req.MessageType&constants.MSG_TYPE_BASE_GROUP >= constants.MSG_TYPE_BASE_GROUP{

}else if if req.MessageType&constants.MSG_TYPE_BETWEEN_USER>=constants.MSG_TYPE_BETWEEN_USER{

}else{

}
  • 并且,在参数校验中,只需要判断是否满足最小的即可

    if r.MessageType&constants.MSG_TYPE_BETWEEN_USER < constants.MSG_TYPE_BETWEEN_USER {
      return errors.New("")
    }
    

算法

HD钱包(Hierarchical Deterministic)

  • HD钱包的全称是:分层确定性钱包
  • 在区块链中可用于管理钱包
  • 钱包生成流程:
    • 1 .生成由12个单词组成的助记词;
    • 2 .通过该助记词生成一串私钥,这串私钥称为主私钥或根私钥;
    • 3 . 通过主私钥/根私钥,生成N对子私钥和子公钥;
    • 4 . 由这些子公钥生成对应的钱包地址。
  • 总结: 只需要备份一串主私钥,由主私钥推断出海量的子公私钥
  • 实际应用:
    • 对于企业级分层应用: 如交易平台,交易平台保管其主公私钥
      • 领导保管一串主公私钥,生成一堆子私钥,旗下部门保存各自的私钥,这样 领导可以管理部门,部门又有其隐私
    • 对于个人而言:
      • 个人保存其主公私钥,每次收款的时候都使用新的地址来收款
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值