`

数据库中用二进制数值存储及查询标识值

 
阅读更多
我要存储会员信息



业务是多变的,需要存储多种标识。



如:



要标识会员是否是卖家,

要标识会员手机是否已认证

要标识会员是网站还是手机注册



。。。。



这些标识是互相独立,需要支持联合查询





一般的做法是针对每个标识做个字段



tinyint  is_sell comment '1:卖家,0:买家'

tinyint  mobile_auth comment '1:已认证,0:未认证'

tinyint regist_from comment '1:网站,2:手机'





要查 是卖家,手机已认证的



is_sell = 1 and mobile_auth = 1





问题



标识是随时可能增加的,这意味着字段也要增加,这显然是非常困难的。





解决办法



1.标识以2的次方设置,标识值相加以10进制存储在字段中





如:卖家标识是 2的0次方,1

      手机认证是 2的1次方,2

      来自手机注册  2的2次方 4



某会员是卖家,来自手机注册,1+4 = 5

存储在数据库标识字段值是:5





2.要查有卖家标识的会员



  (5 & 1) == 1   ------> true



二进制与运算,返回值是该标识表明成立



101

001

-----

001



3.要查有卖家标识且手机认证的会员



  (5 & (1+2))  ==  (1+2)    ----> false





二进制与运算,返回值是几个标识的和表明成立





101

011

------

001







注意:



1. 在mysql中以long字段存储,可以存储2的64方的值,即最多可存储标识64个




public class BitUtils {
	/**
	 * 2的几次方
	 * 
	 * @param position
	 * @return
	 */
	public static long pow2(int num) {
		return ((Double) Math.pow(2, num)).longValue();
	}

	/**
	 * 判断 一个数number的二进制格式的第position位是否为1
	 * 
	 * @param number
	 *            十进制数
	 * @param position
	 *            第几位 右到左从0开始
	 * @return
	 */
	public static boolean isTrue(long number, int position) {
		long decimalValue = pow2(position);
		return (decimalValue & number) == decimalValue;
	}

	/**
	 * 位或 运算
	 * 
	 * @param m
	 * @param n
	 * @return
	 */
	public static long computeOR(long m, long n) {
		return m | n;
	}

	/**
	 * 针对一个10进制数的位运算,增加位
	 * 
	 * @param number
	 *            10进制数
	 * @param position
	 *            位数 从0开始
	 * @return
	 */
	public static long addBit(long number, int position) {
		if (number < 0 || position < 0)
			return 0;
		return computeOR(number, pow2(position));
	}

	/**
	 * 针对一个10进制数的位运算,删除位
	 * 
	 * @param number
	 *            10进制数
	 * @param position
	 *            位数 从0开始
	 * @return
	 */
	public static long removeBit(long number, int position) {
		if (number < 0 || position < 0)
			return 0;

		if (isTrue(number, position)) {
			number = number - pow2(position);
		}
		return number;

	}

	public static void main(String[] args) {
//		System.out.println(pow2(0));
		long a = addBit(0, 5);
		System.out.println(a);
	}
}
分享到:
评论

相关推荐

    管理信息化ORACLE完美Oracle数据库知识学习文档总汇.pdf

    LOB(Large Object)类型用于存储大量数据,包括BLOB(Binary Large OBject)用于二进制数据,CLOB(Character Large OBject)用于文本数据,NCLOB是Unicode支持的CLOB,而BFILE则指向操作系统中的二进制文件。...

    大学计算机基础超详细知识点(高手总结)免费..docx

    7. **二进制的优势**:计算机采用二进制是因为其物理实现容易、运算规则简单、逻辑运算直接,且二进制非常适合表示逻辑状态,适合进行逻辑判断。 8. **进制转换**:通过除法和乘法可以实现不同进制间的转换,如十...

    oracle考试题库.docx

    3. 二进制大对象数据类型:Oracle中用于存储二进制大对象的数据类型是`BLOB`(题目选项C),它可以用来存储图像、视频等大型二进制数据。 4. PL/SQL的基本语法要素:PL/SQL的基本语法包括常量、基本数据类型变量和...

    大学计算机基础超详细知识点高手总结.pdf

    信息编码是用数字串标识处理对象的方法,正负数在计算机中用0和1表示,这被称为数值的数字化。在计算机中,数据存储的基本单位是位(bit),处理数据的基本单位是字节(Byte)。数据量的常见计量单位有KB、MB、GB和...

    计算机中大东校区.doc

    18. 英文字符的ASCII编码在机器中用8位二进制表示,最高位为0。 19. 汉字字库中存放的是汉字的字形码,用于显示和打印汉字。 20. 微型计算机的控制器负责协调各个部件工作。 21. 存储器主要包括RAM(随机访问存储器...

    2021-2022计算机二级等级考试试题及答案No.13483.docx

    7. 计算机信息存储方式:计算机中所有的信息都采用二进制形式存储,这是因为二进制具有计算简单、电路实现方便的优势。 8. 磁盘驱动器的角色:磁盘驱动器属于计算机的外部存储设备,用于读取和写入数据到磁盘。 9....

    2021-2022计算机二级等级考试试题及答案No.19266.docx

    3. 西文字符通常采用ASCII码进行编码,这是一个7位的二进制编码系统,能够表示128个不同的字符。 4. 按作用域从大到小排序,正确的顺序是application &gt; session &gt; request &gt; pageContext。这四个概念在Web开发中...

    2021-2022计算机二级等级考试试题及答案No.10839.docx

    选项A、B和C分别是以十进制、八进制形式表示数值,而D选项是以十六进制形式表示的 `long` 类型数值。 ### 2. 文件扩展名与可执行性 **题目**: 对于Windows操作系统而言,下列哪种扩展名的文件是不可执行的? - **...

    2021-2022计算机二级等级考试试题及答案No.16668.docx

    13. Java数据库操作:ResultSet对象在Java中用于存储SQL查询的结果集。 14. 数据结构:线性结构包括数组、链表等,而非线性结构包括树、图等。二叉树是非线性结构的一个例子。 15. VB窗体文件扩展名:VB窗体文件的...

    2021-2022计算机二级等级考试试题及答案No.2886.docx

    一般情况下,`REPLACE`命令可以应用于除通用型字段之外的大多数字段类型,因为通用型字段通常用于存储二进制大对象(BLOBs)等特殊类型的数据。 ### Visual FoxPro参照完整性规则 13. **题目**:“VisualFoxpro...

    2021-2022计算机二级等级考试试题及答案No.5267.docx

    7. Access数据库对象:Access的对象包括表、查询、窗体等,不包括文件夹。 8. 显示器:显示器是计算机系统的输出设备,用于显示信息。 9. WPS与Word:WPS是国产的办公软件,从安全角度考虑,可作为Word的替代品。 ...

    TDS通讯协议分析报告

    3. **binary**: 二进制数据,JDBC类型为BINARY,Java中用byte数组表示。 4. **bit**: 布尔值,在Java中通常对应boolean。 5. **char/nchar**: 固定长度的字符串,JDBC类型为CHAR和NCHAR,Java中用String表示。 6. **...

    SQL_Server_2008:T-SQL初学者指南

    - **其他数据类型**:如二进制数据(`BINARY`, `VARBINARY`),图像、音频和视频数据(`IMAGE`, `SOUND`, `VIDEO`)等。 #### SQL Server 2008 T-SQL函数类型 T-SQL支持各种内置函数,这些函数可以根据输入返回...

    2021-2022计算机二级等级考试试题及答案No.18071.docx

    - **OLE**:OLE对象通常用于存储图像、声音或其他二进制数据,并不适用于字段大小属性的设置。 - **整型**:整型字段用于存储整数,其字段大小可以通过指定位数来限制。 - **长整型**:长整型字段用于存储较大的...

    PHP基础教程 是一个比较有价值的PHP新手教程!

    如果你又为它赋了整数值,那么它就变成了整数。" $foo = "0"; // $foo是字符串(ASCII 48) $foo++; // $foo是字符串"1" (ASCII 49) $foo += 1; // $foo现在是整数(2) $foo = $foo + 1.3; // $foo是一个双精度数(3.3) ...

Global site tag (gtag.js) - Google Analytics