左移
高位丢弃,低位补0
#include <stdio.h>
#include <stdlib.h>
int main()
{
int i=5;
i=i<<1; //位运算符本身不改变i的值,必须通过赋值实现
printf("%d\n",i);
system("pause");
return 0;
}
5的二进制为:0000 0000 0000 0101
左移后: 0000 0000 0000 1010(10)
左移可以简单理解为×2
但如果将值移成负数了就不是乘2了(实际应用中没啥意义)
#include <stdio.h>
#include <stdlib.h>
int main()
{
short i=0x7f89;
printf("before i = %d\n",i);
i=i<<1; //位运算符本身不改变i的值,必须通过赋值实现
printf("i = %d\n",i);
system("pause");
return 0;
}
右移
正数 低位丢弃高位补0
负数 低位丢弃高位补1
正数:
偶数除2
#include <stdio.h>
#include <stdlib.h>
int main()
{
int i=8;
i=i>>1; //位运算符本身不改变i的值,必须通过赋值实现
printf("i = %d\n",i);
system("pause");
return 0;
}
奇数
#include <stdio.h>
#include <stdlib.h>
int main()
{
int i=7;
i=i>>1; //位运算符本身不改变i的值,必须通过赋值实现
printf("i = %d\n",i);
system("pause");
return 0;
}
0111
0011(低位丢失了一个1)
负数
#include <stdio.h>
#include <stdlib.h>
int main()
{
int i=-8;
i=i>>1; //位运算符本身不改变i的值,必须通过赋值实现
printf("i = %d\n",i);
system("pause");
return 0;
}
-8二进制:
0000 0000 0000 1000(取反加1)
1111 1111 1111 1000(-8右移)
1111 1111 1111 1100 (-4)
-7右移为-4(补码的原因)
所以正负奇数都可以简单记为(-1)/2