在C语言当中有以下6中位操作符:
<< 左移 >> 右移 & 按位与 | 按位或 ^ 按位异或 ~ 取反
左移:在左移位中,值最左边的几位被丢弃,右边多出来的几个空位则由0补齐。
右移:在右移位中,有两种方案,1、算术移位:左边移入的位由原先该值得符号位决定,符号位为1则移入的位均为1,符号位为0则移入的位均为0。2、逻辑移位:左边移入的位用0填充。两种方案只有当操作数为负数时值才不一样。
与:两个位都为1,结果为1,否则结果为0。
或:两个位都为0,结果为0,否则结果为1。
异或:两个位相同结果为0,两个位不同结果为1。
取反:对参与运算的数的各二进位按位求反。
1、指定位置1,指定位清0。
Value |=1<<bit_number;/*指定位置1*/
Value &= ~(1<<bit_number);/*指定位清0*/
2、计算参数二进制值中1的个数
int count_bits(unsigned value) { int ones; for(ones=0;value!=0;value>>1) if(value&1!=0) ones+=1; return ones; }
3、交换两个变量的值,而不用临时变量
普通方法:
void swap(unsigned char *pa,unsigned char *pb) { unsigned char temp=*pa;//定义临时变量,将pa指向的变量值赋给它 *pa=*pb; *pb=temp; //变量值对调 }异或的方法:
void swap_xor(unsigned char *pa,unsigned char *pb) { *pa=*pa^*pb; *pb=*pa^*pb; *pa=*pa^*pb; //采用异或实现变量对调 }4、二进制逆序
原题是在《C和指针》这本书中的第5章第三题
unsigned int reverse_bits(unsigned int value) { unsigned int answer; unsigned int i; answer=0; i=1; for(i=1;i!=0;i<<=1) //将i左移,只要i不等于0就循环下去。 { answer<<=1; //先将答案左移一位为下一个值留出来一个位置 if(value&1) answer|=1; //如果value的最后一位为0,则将answer的最后一位和1相与。 value>>=1; } return answer; }
5、 找出丢失的那个数
一组数当中,总是两个成对出现,但是丢失了一个,请找出丢失的数。
#include<stdio.h> int main() { const int SIZE= 15; int a[SIZE] = {1, 23, 7, 8, 9, 32, 78,1, 23,7, 8, 9, 32, 78,34}; int lost_Num = 0; for (int i = 0; i < SIZE; i++) lost_Num ^= a[i]; printf("丢失的数字为: %d\n", lost_Num); return 0; }
6、如何把一个32位的unsigned int型值,两位两位一组,两头互换,(即第31位和第0位互换,第30位和第1位互换.....)最后返回结果。
unsigned int bit_reverse(unsigned int n) { n = ((n >> 1) & 0x55555555) | ((n << 1) & 0xaaaaaaaa); n = ((n >> 2) & 0x33333333) | ((n << 2) & 0xcccccccc); n = ((n >> 4) & 0x0f0f0f0f) | ((n << 4) & 0xf0f0f0f0); n = ((n >> 8) & 0x00ff00ff) | ((n << 8) & 0xff00ff00); n = ((n >> 16) & 0x0000ffff) | ((n << 16) & 0xffff0000); return n; }