位操作符

来源:互联网 发布:淘宝客服时间 编辑:程序博客网 时间:2024/06/06 03:05

 操作符的种类:  

 在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;  }  





0 0
原创粉丝点击