位操作符

 操作符的种类:  

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





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值