每右移一位就是除以2,左移一位就是乘以2。C语言中,数字是二进制存储的,左移和右移就是变化为2的指数形式。
演示代码:
#include<stdio.h>
int main(){
int i = 2
printf("i的值为%d\n",i)
printf("i向右一位后的值为:%d\n",i>>1)
printf("i向左一位后的值为:%d\n",i<<1)
return 0
}
程序运行结果:
扩展程序
C语言中,移位运算符组成的表达式也属于算术表达式,其值为算术值。左移运算是将一个二进制位的操作数按指定移动的位数向左移动,移出位被丢弃,右边移出的空位一律补0。
右移运算是将一个二进制位的操作数按指定移动的位数向右移动,移出位被丢弃,左边移出的空位一律补0,或者补符号位,这由不同的机器而定。在使用补码作为机器数的机器中,正数的符号位为0,负数的符号位为1。
参考资料:百度百科-移位运算符
默认只有算术右移。 要循环右移需要把最低位保存下来, 然后赋值到最左。
unsigned int func(unsigned int n){
unsigned int v=n&1
n>>=1
if(v) n|=1<<(sizeof(unsigned int)-1)
return n
}
对于无符号整数,除法和右移效果是一样的;
对于有符号的正整数,除法和右移的效果也是一样的;
对于有符号的负整数,除法和右移的效果是不一样的;
比如:-3/2 = -1-3>>1是多少呢?
我们可以将其按照8位二进制展开-3的8位二进制是1000 0011,负数在计算机中是以补码的形式存储的,所以还需要将其转换成补码1000 0011
转换成反码 1111 1100(最高位符号位不动), 再加1转换成补码1111 1101
接着将其右移1位,由于是有符号负整数,所以最高位补1,变为1111 1110
接着将其还原成原码,1111 1110减1变反码1111 1101,接着反码取反变原码1000 0010,转换成十进制是-2,
也就是说-3>>1得到的是-2
其实这是因为 除法是向0取整,而右移位是向负取整
-3/2=-1.5=-1(向0取整),-3>>1=-1.5=-2(向负取整);
如果我们需要右移达到的效果和除法一样,可以采取下列公式:
假设除数为2^N,负数x的除法可以用以下方法来代替:(x + 2^N - 1) >>N
本文来自 西门一雪 的CSDN 博客 ,全文地址请点击: https://blog.csdn.net/liubo_10184653/article/details/80500418?utm_source=copy