>>
左移
各二进位全部左移若干位,高位丢弃,低位补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;
}