位运算
位运算符的分类及其定义
- 与运算符
&
: 既二进制情况下,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 . 由这些子公钥生成对应的钱包地址。
- 总结: 只需要
备份一串主私钥,由主私钥推断出海量的子公私钥
- 实际应用:
- 对于
企业级分层应用
: 如交易平台,交易平台保管其主公私钥- 领导保管一串主公私钥,生成一堆子私钥,旗下部门保存各自的私钥,这样 领导可以管理部门,部门又有其隐私
- 对于个人而言:
- 个人保存其主公私钥,每次收款的时候都使用新的地址来收款
- 对于