每个八进制对应3个二进制位
每个十六进制为都对应一个4位的二进制数
位操作技巧
使用 | 运算符,任何位与0组合,结果都为本身,任何位与1组合,结果都为1
使用&,任何位与1组合都得本身,任何位与0组成都为0
位字段
位字段(bit field)是一个unsigned int或signed int中一组相邻的位。位字段由一组声明结构建立,该结构声明为每个字段提供标签,并且决定字段的宽度。就是把一个int型拆成以‘位’位单位的字段来用。
一个位字段必须存储在同一个字节中不能跨越两个字节.如果一个字节所剩空间不够存放另一个位字段时,将从下一字节起存放此位字段.可以定义无名位字段,这时它只用来作填充或调整位置.0宽度的无名位字段用来使下一个位字段从新的字节起始位置开始存储,达到调整某位字段从下一字节开始的目的,
struct box_props {
unsigned int opaque : 1;
unsigned int fill_color : 3;
unsigned int : 4;
unsigned int show_border : 1;
unsigned int border_color : 3;
unsigned int border_style : 2;
unsigned int : 2;
unsigned int : 0;
};
上面的代码定义格式并不统一。
(1)unsigned int opaque : 1;建立了一个宽度为1位(已经是最小了!)的字段,并且他的标签是opaque(就是name,以后可以通过它来使用这个位);
(2)unsigned int fill_color : 3;这个类比第一个就是宽度变大了,是占3个bit的字段。
(3)unsigned int : 4;这个有些奇怪。竟然没有tag,那怎么用?当然这个是没法用的,只是为了占4个位置(bit)。有时候你定义了28个字段,但是一个int型通常是32位,这时候就会在这个int内存中留下一个4位的‘洞’,是不是就可以用这种定义填充呢!
(4)unsigned int : 0;这个更奇怪,连宽度都没有是什么意思?! 可以这样想:一个int是4个字节组成,也就是32位,加入你定义了一系列的字段,当字段的累计宽度超过了32位,这个时候就应该有一种处理的方式:那将会使用下一个unsigned int的存储位置。不允许一个字段跨越两个unsigned int之间的边界。编译器会自动的移位一个这样的字段定义,使字段按unsigned int边界对齐。使用一个宽度为0的未命名的字段迫使下一个字段与下一个整数对齐!