位运算
1.使c区别于许多高级语言的特性之一,是访问整数中的个别位的能力。该特性通常是程序与硬件设备和c操作系统相连接的关键
c语言中两个主要的访问位的工具。位运算符(| ,& , >> 右移, << 左移);在结构体中创建位字段的能力
二进制 0 1 可以用于表示计算机内存和寄存器中位的打开和关闭状态,所以计算机硬件与二进制数字系统紧密相连。
示例1:打印整数对应的二进制位
void bin_dis(int var) { int i=8; while(i--){ if(var & 1<<i) printf("1"); else printf("0"); if(i%4 == 0) printf(" "); } printf("\n"); }
2.掩码 mask
unsigned char MASK = 1<<1;
unsigned char flag = 0x96;
位于掩码结合的功能:
打开位 (将某一位置1) flag |=MASK;
关闭位(将某一位置0) flag &=~MASK;
转置位(位反转) flag ^=MASK;
查看某一位的值 if((flag&MASK) == MASK)
示例2:n位掩码的生成
int n = 8; int mask =0; while(n--) { mask |=(1<< n); } int mask=(1<<6)|(1<<5)|(1<<4)|(1<<3)|(1<<2) for(int i =6;i>=2;i--) { mask |= (1<<i) }
示例3 实现循环移位,当n>0 的时候左移,n<0的时候循环右移
void circleMove(/*unsigned */int *pdata,int n) { int m; if(n<0) m = -n; else m = n; unsigned int mask = 0; while(m--) { mask |= (1<<m); } if(n>0)//左循环 { *pdata = (*pdata<<n) | mask &(*pdata>>(sizeof(*pdata)*8-n)); } else //右循环 { *pdata = (*pdata>>-n)| (mask &*pdata)<<(sizeof(*pdata)*8-(-n)); } }
3.无参交换(无溢出) 异或之后出现0的情况要慎重
void swap(int *p1,int *p2) { *p1=*p1^*p2; *p2= *p1^*p2; *p1=*p1^*p2; }