毕业季,浪了很久。。。过了这个六月,就正式踏入社会啦。。。总感受还没准备好。。。。。。。。。。 特大转折。。。记录一下最近的一些知识。。。javascript
按位存储的概念css
在数据库存储中,可使用一种类二进制字符串来保存多个值,当这个二进制值是由0和1组成的时候,就能够按照从右到左,每一个位按照2^n计算值相加进而换算成为一个十进制数,从而实现一个十进制值保存多种状况的目的。java
举个栗子数据库
如今3种不一样的css样式,能够应用于不一样的一些地方,如app、pc、小程序等。小程序
按值存储的话,分别用1-3表明3种样式(styleType),分别用1-3表明支持类型app、pc、小程序(supportType),而后存储的时候应该是按这种方式:segmentfault
styleType | supportType |
1 | 1,3 |
2 | 1,2,3 |
3 | 1 |
... | ... |
显然,这样的话,supportType这个字段就要存储多个styleType表明值。数组
那么,按位存储是怎样的呢。用3位的类二进制字符串来表示,从左到右每一位分别对应样式1-3,1表明支持该样式,0表明不支持该样式。如要表明支持样式1,3的话,就用101来表示,第1、三位为1,其余位置0.那咱们存储的时候,是否是就存储这么一个3位的字符串呢。并非,要存储的是转换后的一个十进制的数值。由于每个位按照2^n转换以后相加获得的十进制必然能够反解,这样就能够知道这个值表明的是哪些样式了。app
按位存储的话,应该是这样存的:编码
styleType | supportType |
1 | 5 |
2 | 7 |
3 | 1 |
... | ... |
实际应用spa
①场景一,在app环境中,过滤样式,即只把支持app的样式过滤出来显示。
应用原理:数值相与,只有1与1结果为1。
也就是说,咱们若是要过滤出支持app的样式,也就是过滤styleType中第一位为1时对应的样式,即1**,也就是十进制数值中包含4这个数的。
js中,十进制数能够直接相与,因此遍历过滤时代码能够直接这样判断:
(item.supportType & 4 == 4)?'对应的styleType支持':'对应的styleType不支持' //注意,==优先级比&大,因此要加括号
②场景二,修改supportType
由于保存到数据库中的是一个十进制的数组,因此才修改对应关系的时候,必须知道改的是哪一个位置,并改变相应位置上的值,类二进制表示就是0变为1或1变为0的过程,可是改变十进制的数组则是改变对应的位的2^n的增长减小过程。
如:
var supportType = { //按位编码,预留3位 'app':4, 'pc':2, 'mini':1 } var supportVal = 0; i f(obj.supportmini == 1){ //支持小程序 supportVal= supportVal+supportType .mini; } if(obj.supportPc == 1){ //支持pc supportVal= supportVal+ supportType .pc; } obj.supportVal= supportVal;
最后,把对应的十进制存到数据库中便可。
更多场景参考这里。