使用移位操作符实现无符号整数位反转

>>

左移

各二进位全部左移若干位,高位丢弃,低位补0

>> 

右移

各二进位全部右移若干位,对无符号数,高位补0,有符号数,各编译器处理方法不一样,有的补符号位(算术右移),有的补0(逻辑右移)。

左移右移符号结合性L-R
  
#include <stdio.h>  
template <class T>  
void PrintfBinary(T a)  
{  
    int i;  
    for (i = sizeof(a) * 8 - 1; i >= 0; --i)  
    {  
        if ((a >> i) & 1)  
            putchar('1');  
        else   
            putchar('0');  
        if (i%8==0)  
            putchar(' ');  
    }  
    putchar('\n');  
} 

int main()  
{  
	int ll=0x800000ff;
	printf("算数右移1位:\n");
	PrintfBinary(ll);
	ll>>=1;
	printf("算数右移后\n");
	PrintfBinary(ll);
}  



1与0异或得1,1与1异或得0,所以与1异或的结果与原来的位相反。
0与0异或得0,0与1异或得1,所以与0异或的结果与原来的位相同。

1与0相与得0,1与1相与的1,所以与1相与的结果与原来的位相同。
0与0相与得0,0与1相与得0,所以与0相与的结果为0。

1与0相或得0,1与1相或得1,所以与1相或的结果为1。
0与0相或得0,0与1相或得1,所以与0相或的结果与原来的位相同。
<pre name="code" class="html">#include <stdio.h>  
template <class T>  
void PrintfBinary(T a)  
{  
    int i;  
    for (i = sizeof(a) * 8 - 1; i >= 0; --i)  
    {  
        if ((a >> i) & 1)  
            putchar('1');  
        else   
            putchar('0');  
        if (i == 8)  
            putchar(' ');  
    }  
    putchar('\n');  
} 
template<typename T>
T Reverse(T a)
{
	int len=sizeof(T)*8;
	int i,j;
	i=0;
	j=len-1;
	int tem1,tem2;
	while(i<j)
	{
		tem1=(a>>(i%len))&1;
		tem2=(a>>(j%len))&1;
		if(tem1!=tem2)
		{
			a^=1<<(i%len);
			a^=1<<(j%len);
		}
		i++;
		j--;
	}
	return a;
}
int main()  
{  
    printf("二进制逆序\n\n");  

    printf("逆序前:    ");  
    unsigned short a = 12345;  
    PrintfBinary(a);  
    printf("逆序后:    ");    
	unsigned short result=Reverse(a);
    PrintfBinary(result);  
}  

 
  
 


计算整数中1的个数:
#include <stdio.h>  
template <typename T>  
void PrintfBinary(T a)  
{  
    int i;  
    for (i = sizeof(a) * 8 - 1; i >= 0; --i)  
    {  
        if ((a >> i) & 1)  
            putchar('1');  
        else   
            putchar('0');  
        if (i % 8==0)  
            putchar(' ');  
    }  
    putchar('\n');  
} 
template<typename T>
int comnumof1(T a)
{
	int len=sizeof(T)*8;
	int count=0;
	for(int i=0;i<len;i++)
	{
		if(( (a>>i)&1)==1)
			count++;
	}
	return count;
}
int main()  
{  
    printf("二进制中1的个数\n\n");  
    unsigned short a = 34520;  
    printf("原数    %6d的二进制为:  ", a);  
    PrintfBinary(a);  
    printf("原数   %6d中1的个数为%d \n",a,comnumof1(a));
    
    return 0;  
}  


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值