位操作符:
1、位与 &
2、位或 |
3、位异或 ^
4、位取反 ~
5、左移位 << 右移位 >>
(3)从真值表可以看出:位或操作的特点是,只有0和0位或的结果是0,其余全是1.
(4)位或和逻辑或的区别:位或时两个操作数是按照二进制位彼此对应为相或的,逻辑或是两个操作数作为整体来相或的。
#include<stdio.h>
#include<stdlib.h>
int main(void)
{
int a = 45;
int b;
int c;
b = ~a;
c = !a;
printf("b=%d\n",b);
printf("c=%d\n",c);
system("pause");
return 0;
}
#include<stdio.h>
#include<stdlib.h>
int main(void)
{
unsigned int a = 45; // a:101101
unsigned int b = 23; // b:010111
unsigned int c; // c:111010
c = a^b;
printf("c=%d\n",c);
system("pause");
return 0;
}
注意最后一条,有符号数,右移位左侧补符号位
4.2.2.5、举例:
(1)我们需要一个bit3~bit7为1(隐含意思就是其他位为0)的二进制数我们可以这样做:(0x1f << 3).
(2)更难的要求,获取bit3~bit7为1,同时bit23~bit25为1,其余位为0
#include<stdio.h>
#include<stdlib.h>
int main(void)
{
unsigned int a ;
a =( (0x1f << 3)|(0x7 << 23));
printf("a=0x%x\n",a);
system("pause");
return 0;
}
(3)获取bit4~bit10为0,其余为1.
#include<stdio.h>
#include<stdlib.h>
int main(void)
{
unsigned int a ;
a = ~(0x7f<<4);
printf("a=0x%x\n",a);
system("pause");
return 0;
}
4.2.2.6、位运算实战演练:
(1)a | = (1 << 3);
(2)a |= (0x1f << 3);
(3)a &= (~(1 << 15));
(4)a &= (~(0x1ff<< 15));
(5)
(6)
要明白置1和赋值都是用位或。赋值之前要把原来的数清除。
(7)
(8)
//备注:第七题和第八题的0x3ff是误写,真实的是0x7ff.