为了节省空间(这个应该是最初在C语言中使用bit操作的主要原因),当某些变量只会取有限几种值,这时就可以使用几个bit位进行数据的存储。
例如:00000000这是一个char大小的二进制值,假设我们需要8个flag,每个flag只会取0或者1,这样的值(当然不限于0与1,也可以是任意的值,只要只有两种),这是就可以用每个bit位来代表一个flag。还有,如果flag可以取三个值,那么可以用两个bit位来存储flag。
为了取得flag的值,这是就需要使用位运算了。为了便于理解偏移,下面的数据基本上都是使用十六进制方式表示。
例如: char a = 0x8000; 其中第一个bit位代表flag1,那么a >>7就可以得到flag1的值为1。
下面再举例说明一下位偏移的用法。
#include <stdio.h>
#include <stdlib.h>
int main()
{
int a = 0x1234;
int b = 0x5678;
printf("a>>>8: %x/n", a >> 8);
printf("b<<8: %x/n", b << 8);
return 0;
}
运行结果为:
a>>8: 12
b<<8: 567800
除了上面的使用方式外,还有一种不用偏移就可以取得bit位值的方式,那就是把bit位作为结构体的成员变量来使用。其类型可以是int,short或者char之类的整形。
例如:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct sbit {
char a:7;
char b:1;
char c;
};
int main()
{
struct sbit sbit;
memset(&sbit, 0, sizeof(sbit));
sbit.a = 0x7E;
sbit.b = 1;
sbit.c = 0x34;
printf("sbit.a: %x/n", sbit.a);
printf("sbit.b: %x/n", sbit.b);
printf("sbit.c: %x/n", sbit.c);
return 0;
}
运行结果为:
sbit.a: 7e
sbit.b: 1
sbit.c: 34
如果给bit型变量赋值超过其表示范围,则值为0.这点儿与一般类型的变量不同。
例如:
int main()
{
struct sbit sbit;
memset(&sbit, 0, sizeof(sbit));
sbit.a = 0x80;
sbit.b = 2;
sbit.c = 0x134;
printf("sbit.a: %x/n", sbit.a);
printf("sbit.b: %x/n", sbit.b);
printf("sbit.c: %x/n", sbit.c);
return 0;
}
运行结果为:
sbit.a: 0
sbit.b: 0
sbit.c: 34
其他的位运算还有:按位与&、按位或|、按位异或~ 、按位取反~ 等,都是需要把数据转成基本的二进制后才能进行计算,相对来说也比较容易理解,这里就不再赘述了。