按位与 &
两个都不为0即为1
如果参加&运算的是负数(-3&-5),则要以补码形式表示为二进制数,然后再进行按位与运算。
用途:
清零 : 将二进制数11100101的第二位清零 11100101 & 11100011
取一个数中某些指定位:对一个字型数据取出其低5位的值
11010101 01011011
& 00000000 11111111
00000000 01011011
按位或 |
有一个为1结果就为1
A 65 100 0001 第五位不一样
a 97 110 0001
异或 XOR ^
相同为0 不同为1
使特定位翻转 : 使0111 1010 低四位翻转
0111 1010
^ 0000 1111
0111 0101
与0异或,保留原值
0000 1010
^ 0000 0000
0000 1010
交换两个值,不用临时变量
a=a^b;
b=b^a; //b=a;
a=a^b;
取反 ~
按位取反
左移运算符 <<
左移一位则该数扩大为原来的2倍 右边补0 a<<1
右移运算符 >>
右移一位 缩小一倍 左边补0
在右移时,需要注意符号位问题
如果符号位原来为1(即负数),则左边移入0还是1要取决于操作系统
位运算赋值运算符
位运算符与赋值运算符可以组成符合赋值运算符。
例如: &= |= >>= <<= ^=
a&=b 即 a=a&b
题目:取一个char a从右端开始的2~5位。
①先使a右移2位:a>>2(目的是使要取出的那几位移到最右端)
②设置一个低4位全为1,其余全为0的数 ~(~0<<4)
③进行&运算 (a>>2)& ~(~0<<4)
题目:要求将a进行右循环移位
1011 0100 2 a
0010 1101 结果 d
0000 0000 b=a<<(sizeof(char)*8-n);
0010 1101 c=a>>n;
0010 1101 d=b|c;
位段
信息的存取一般以字节为单位。实际上优势存储一个信息不必用一个或多个字节.
例如,真假用1或0表示,只需一位即可。
在计算机用于过程控制,参数检测或数据通信领域时,控制信息往往只占一个或几个二进制位,常常在一个字节中放几个信息。
c语言允许在一个结构体中以位为单位来指定其成员所占内存长度,这种以位为单位的成员称为“位段”或称“位域bit field”。利用位段能够用较少的位数存储数据。
struct packed-data
{ unsigned a:2;
unsigned b:6;
unsigned c:4;
unsigned d:4;
int i;
}data;
①位段成员的类型必须指定为unsigned或int类型
②可以定义无名位段
③..