一、计数一个值中值为1的位的个数
//这个函数返回参数值中值为1的位的个数int count_one_bits(unsigned value){ int ones=0; //当这个值中还存在一些值为1的位时 for(ones =0;value!=0;value>>=1) { if((value&1)!=0) { ones++; } }}
(1)这里我们先假设value的值为 0001 0000;
(2)那么value&1不为0,则ones加1;
(3) 然后value右移1位;即0000 1000;此时value&1;任然不为0,ones加1;
如此循环下去;最终获取value中bit为1的个数。
二、关于左移和右移
<<左移 >>右移
可以这么记。比如书名号是《》这样的,书名号的左边《就是左移,书名号的右边》就是右移。
左移就是值得最后bit位依次补0,而右移就是值得最前bit位依次补0.
三、位操作符
& | ^
a = 0010 1110,
b = 0101 1011,
(1) a&b = 0000 1010; 如果两位都为1,则为1;否则为0
0010 1110
0101 1011
------------------
0000 1010
(2) a|b = 0111 1111;如果两位都为0,则为0;否则为1
0010 1110
0101 1011
------------------
0111 1111
(3) a^b = 0111 0101;如果两位不同,结果为1,否则为0
0010 1110
0101 1011
------------------
0111 0101
0000 1010
(4)把指定位的bit设置为1
value|=1<<bit_number;//从右向左,第bit_number位,置为1;
(5)把指定位的bit设置为0
value&=~(1<<bit_number);
(6)判断指定bit位是否为1
value&1<<bit_number;
四、前缀++和后缀++
在操作数之前的操作符在变量值使用之前增加它的值;
在操作数之后的操作符在变量使用之后增加它的值。
五、关于强制转换
只能低位向高位转,
不能高位向低位转
比如 int转char;由于char只占1byte;而int占4个byte,那么强转后,int值必须丢弃3byte的值,转成char型时,结构已经不对,裁剪了。