操作符的种类:
在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;
}