C语言问题,在位运算中,操作数每右移一位,其结果相当于什么?若左移1位,其结果相当于什么?

Python021

C语言问题,在位运算中,操作数每右移一位,其结果相当于什么?若左移1位,其结果相当于什么?,第1张

每右移一位就是除以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