原文地址http://daileinote.com/computer/c_base/09
按位取反:~
0变成1,1变成0。
按位与:&
两边都为1的为1,其他为0。
按位或:|
只要有一方为1的就为1,其他为0。
按位异或:^
一方为0,一方为1的为1,其他为0
例子
#include<stdio.h>
typedef unsigned char u_char;
void main()
{
u_char c;
u_char a = 3; //00000011
u_char b = 100; //01100100
c = ~a; //11111100即252
printf("%d\n", c); //252
c = a & b; //00000000
printf("%d\n", c); //0
c = a | b; //01100111即103
printf("%d\n", c); //103
c = a ^ b; //01100111即103
printf("%d\n", c); //103
}
下面由例子看一次实际应用场景
#include<stdio.h>
typedef unsigned char u_char;
void main()
{
u_char res;
u_char f = 202; //11001010
u_char mask = 2; //00000010
res = f & mask; //只让第1位显示
//打开设置位
res = f | mask; //开启1位(第1位必定为1)
//关闭位
res = f & ~mask; //也就是与11111101与,第1位必定关闭
//切换位
//假设我们想把最后3位切换,则mask可以设置为11100000(只需把想切换的为设为1)
//运算一次切换一次
mask = 224; //11100000
res = f ^ mask; //00101010
//判断位是否为1
//比如想判断第1位是否为1,则可以吧mask设置为00000010
mask = 2; //00000010
if((f & mask) == mask){
printf("已开启\n");
}
}
左移运算符:<<
左侧的值向左移动,移出左端的值丢失,用0填充右边空出来的位置。
右移运算符:>>
右侧的值向右移动,移出右端的值丢失,无符号的类型用0来填充左边空出来的位置,有符号的根据操作系统来决定用1或0来填充。
#include<stdio.h>
typedef unsigned char u_char;
void main()
{
u_char res;
//无符号
u_char f = 185; //10111001
res = f << 2;
printf("%d\n", res);//228 11100100
res = f >> 2;
printf("%d\n", res);//46 00101110
//有符号
char g = 185; //10111001
res = g >> 2;
printf("%d\n", res);//238 11101110
}
实际应用:
1.number << n number乘以2的n次幂
2.number >> n 如果number为非负,则为number除以2的n次幂
3.也可以用来提取部分的位
#include<stdio.h>
typedef unsigned char u_char;
typedef unsigned int u_int;
void main()
{
u_int s = 0xa; //10
//相当于s*2^4
s = s << 4;
printf("%d\n", s); //160
//相当于s/(2^2)
s = s >> 2;
printf("%d\n", s); //40
//提取部分位
u_char mask = 0xff; //11111111
u_int rgb = 0x00bbccdd;
u_char blue = rgb & mask;
u_char green = (rgb >> 8) & mask;
u_char red = (rgb >> 16) & mask;
//dd cc bb
printf("%x %x %x\n", blue, green, red);
}