我们知道数据在计算机内存中都是以二进制形式存储的。
在内存中一般是以字节为单位存储数据,一个字节有8个位(bit)。
比如数字3如果以一个字节来存储 ,在内存以二进制表示是”0000 0011″,这时候从右到左,分别称为从第1位到第8位。
现在假如想取第1位的值,可以使用AND运算符 把要取的值与1做位比较运算。
因为1的二进制形式是“0000 0001”,所以如果用任何一个二进制与1做AND比较,其余位的值都将变为0,只剩下第一位,假如被比较的值的第一位是0,将返回0,第一位是1将返回1,通过返回的十进制值可以直接得出被比较的值的第一位是0还是1。
按照这个思路,假如要取二进制中第二位的值,只需要把第二位与1比较,其它位全部与0比较。假如返回的值时0,则第二位为0,返回的值非0,则第二位的值时为1。能满足第二位为1,其它位都为0的十进制值是2,因为2的二进制表示形式是“0000 0010”。
依次类推,假如要取第三位的值,只需要与十进制值4(二进制形式“0000 0100”)比较,要取第四位的值,只需要与十进制值8(二进制形式“0000 1000”)比较,要取第N位的值,只需要与十进制值2的N-1次幂比较即可,返回的十进制结果如果是0,表示第N位是0,如果非0,表示第N位是1。
根据以上的原理分析,可以在VBA中自定义如下的取二进制位的取位函数。
Visual Basic
Public Function GetBit(ByVal i As Long, ByVal n As Byte) As Boolean