标签:
1 按位与&(0与任意数结果为0,1与任意数不变)
1.1 让某一些位变为0:
x & 0xfe,让最后以为变为0,其他位不变。
1.2 取出某些位:
x & 0xff,取出最后8位。
2按位或|(0或任意数不变,1或任意数结果为1)
2.1 让某些位变为1
x | 0x01,让最后一位变为1。
2.2让两个数连在一起
0x00ff | 0xff00,结果为0xffff。
3异或^
x ^ y ^ y结果为x
4左移
低位补0,移1位,相当于乘2
x <<n等价与 x /*=2^n
5右移
无符号数,高位补0,有符号数,高位补符号。
x >>n等价与 x / =2^n
6非~
~x表示对x的每一位取反。
输出一个整数的二进制形式
1 void prtBin(unsigned int number) 2 { 3 unsigned int mask = 1u<<31;//1u表示1是unsigned int型 4 for( ; mask ; mask>>=1) 5 { 6 printf("%d", number&mask?1:0); 7 } 8 printf("\n"); 9 10 } 11 /*mask是一个只有1位为1的数字,1从最左端移动到最右端,将number与mask做按位与,由此可以知道number的每一位是否为1*/
MCU中的SFR(特殊功能寄存器)利用位操作
1 /*问题:通过改变U0LCR来实现各个功能的开关*/ 2 const unsigned int SBS=1u<<2;//SBS在第二位 3 const unsigned int PE=1u<<3;//PE在第三位 4 U0LCR |=SBS |PE;//通过和1做或运算,使得U0LCR的二、三位为1,其他位不变 5 U0LCR &=~SBS;//通过和0做与运算,使得U0LCR的二位变为0,其他位不变 6 U0LCR &=~PE;//通过和0做与运算,使得U0LCR的三位变为0,其他位不变 7 U0LCR &=~(SBS | PE);//通过和0做与运算,使得U0LCR的二、三位变为0,其他位不变
位段操作
某些功能控制可能是由几位一起实现的
1 #include<stdio.h> 2 3 void prtBin(unsigned int number); 4 struct U0{ 5 unsigned int leading:3; 6 unsigned int FLAG1:1; 7 unsigned int FLAG2:1; 8 int tailing:27; 9 }; 10 int main(int argc,char const *argv[]) 11 { 12 struct U0 uu; 13 uu.leading=2; 14 uu.FLAG1=0; 15 uu.FLAG2=1; 16 //uu.tailing=0xff00ff; 17 uu.tailing=0; 18 printf("sizeof(uu)=%d\n",sizeof(uu)); 19 prtBin(*(int*)&uu); 20 21 return 0; 22 } 23 24 void prtBin(unsigned int number) 25 { 26 unsigned int mask = 1u<<31;//1u表示1是unsigned int型 27 for( ; mask ; mask>>=1) 28 { 29 printf("%d", number&mask?1:0); 30 } 31 printf("\n"); 32 33 } 34 35 //巧妙的用一个结构体来表示多个控制位段,可以用位段的成员名称来访问 36 //当结构体内所需的位数超过一个int时,会扩充为多个int
标签:
原文地址:http://www.cnblogs.com/tbhdwx/p/4430642.html