C语言并没有规定一个字节的尺寸
逻辑位运算符
只作用于整型,对操作数中的每个二进制位起作用
反
与
异或^
或
和赋值号结合
四个运算符,除了按位取反只有一个操作数之外,其他三个都可以与赋值号结合到一块,使得代码更加简洁
int mask=0xFF;
int v1=0xABCDEF;//0x表示是16进制
int v2=0xABCDEF;
int v3=0xABCDEF;
v1 &=mask;
v2 |=mask;
v3 ^=mask;
printf(""v1=0x%X\n,v1);//这是二进制打印的格式
printf(""v2=0x%X\n,v2);//这是二进制打印的格式
printf(""v3=0x%X\n,v3);//这是二进制打印的格式
打印结果
位域
允许将字节拆开来使用
在结构体的基础上变形而来
Struct Test
{
unsigned int a:2;
unsigned int b:1;
unsigned int c:1;
};//用了冒号 与普通结构体不同 冒号后面的数字表示占了多少位,这里表示一共占了4位
成员c存不进2,因为十进制2的二进制表示为10,需要2位表示。
位域必须要大于要存储的数据的大小。
移位和位操作的应用
C语言还提供了可以将某个变量中所有的二进制位进行左移或者右移的运算符----移位运算符
左移
11001010<<2
//左边是被移位的数据,左移箭头朝左
空缺位置要用0进行填充
右移
11001010>>2
和赋值号结合
int main()
{
int value=1;
while(value<1024)
{
value<<=1;
printf("value=%d\n",value);
}
putchar('\n');
printf("------------------");
int value1=1024;
while(value1>0)
{
value1>>=2;
printf("value1=%d\n",value1);
}
putchar('\n');
return 0;
}
左移一位是乘2的1次方
右移一位是除以2的1次方,右移两位就是除以2的2次方
未定义行为
掩码
将源码与掩码经过按位运算或逻辑运算得出新的操作数。其中要用到按位运算如OR运算和AND运算。用于如将ASCII码中大写字母改作小写字母。
如A的ASCII码值为65= (01000001)2,a的ASCII码值为97=(01100001)2,要想把大写字母A转化为小写字母只需要将A的ASCII码与(00100000)2进行或运算就可以得到小写字母a。
1表示通电,0表示断开