c/c++ 语言 左右移位操作

c语言里,负数的左移怎么移?是对内部补码的移动?符号位要不要移动?

这是我学习位移时的笔记,很清楚。负数的位移是要看编译器的。

7,左移运算符(<<)是双目运算符,其功能是把"<<"运算符左边的运算数的各二进位全部左移若干位,移动的位数由"<<" 运算符右边的数指定,高位丢弃,低位补0。 如:a<<2 //代表a的二进数向左移动2位。
//实际上左移一位相当于该数乘以2,称动2位 相当于该数乘以4,以此类推。这种情况只限于移动位不含1的情况。
8,右移运算符(>>)是双目运算符,其功能是把">>"运算符左边的运算数的各二进位全部右移若干位,移动的位数按">>" 运算符右边的数指定。
//在进行右移时对于有符号的数需要注意符号问题,当为正数时,最高位补0,而为负数时,最高位补0或1取决于编译 系统的规定,移入0的称为"逻辑右移",移入1的称为"算术右移"。(visualC++)是以算术右移。
循环移位
1,循环移位就是将移出的低位放到该数的高位或者移出高位放到该数的低位。
如:a.00110000,00000000,11010000,00001011 左循环移动4位
z.10110000,00000000,00000000,00000000 先左移32-4=28位后的结果。 公式为:z=a<<(32-n) //此时n=4
y.00001100.00000000,00001101.00000000 再右移4位的结果。 y=a>>n
a.10111100.00000000,00001101.00000000 这就是循环左移4位的结果。 a=z|y
2,右循环移动的方法类似,只需要转换即可。
温馨提示:内容为网友见解,仅供参考
第1个回答  2013-07-05

是的,

    unsigned a = -1; // (a = 0xffffffff)
    int b = -1; // (b = 0xffffffff)
    a >>= 5; //(a = 0x07ffffff)
    b >>= 5; // (b = 0xffffffff)

追问

我说的是左移,不是右移

追答

哦, 好吧. 左移就在右边加0, 左边按位移出. 可能会把符号位移走.

    int a = -1; // (a = 0xffffffff)
    int b = -2147418113; // (b = 0x8000ffff)
    a <<= 5; //(a =  0xffffffe0)
    b <<= 5; // (b = 0x001fffe0, 符号位被移走了

第2个回答  2013-07-05
<<1 等于*2??

C \/ C ++中的左移和右移运算符
在C \/ C++编程中,左移和右移运算符是两位数操作的核心元素,用于处理数字的位级操作。左移运算符(<<)接受两个参数,第一个是被操作数,它会根据第二个参数(移位数)相应地位移。实际上,这等同于将第一个数乘以2的幂次方,即 x << y 等同于 x * 2^y。然而,这个操作对负数和位移幅度...

c\/c++的bit的左移右移移位操作详解(最新标准)
左移操作符为 <<,它将第一个操作数的位向左移动指定的位数,即 num1 << num2。右移操作符为 >>,它将第一个操作数的位向右移动指定的位数,相当于将 x 除以 2^y,即 (x>>y)。若右移操作数为负数或大于左操作数的位范围,结果则未定义。移位操作分为逻辑移位和算术移位。逻辑移位仅在...

关于c c++中的移位操作,是真正物理内存上的左移,右移,还是逻辑数字上的...
移位指令分为两种,一种是循环移位,一种是顺序移位(移位后空位会补零),对于32位机4字节的int值移位只要执行移位指令那么ALU(算术逻辑单元)会将需要移位的的物理内存中的数装入寄存器A,然后执行移位操作,

C语言位运算符:与、或、异或、取反、左移和右移!
在C语言的世界里,位操作符犹如二进制运算的瑞士军刀,它们包括按位与(&)、按位或(|)、按位异或(^)、取反(~)、左移(<>),在处理二进制数据时展现出了强大的威力。<\/ 按位与(&):<\/ 这个运算符如同一个精密的清零工具,通过与操作可以清零低字节或保留特定位。例如,60与17的按位与运算结...

<<在c语言中是什么意思?
是“移位操作符”,具体一点是左右移位操作符,比如 int = 1...换成二进制就是。。。a = 0001 , 然后 “ int b = a<<2 ” , 那么就是将0001的所有位数都向左咦 2位。。最后面补0,,就变成了“ 0100 “也就是说 b = 0100或者 b = 4 ...

C语言位运算符:与、或、异或、取反、左移和右移!
C语言的世界里,隐藏着一组神秘的代码符咒——位运算符,它们分别是:&(按位与)、|(按位或)、^(按位异或)、~(取反)、<>(右移)。这些运算符,如同魔法般,让整型数据(char, short, int, long)在二进制的舞台上跃动,展示着它们独特的魔力。首先,我们来看看&(按位与):它就像一...

C语言中 移位 和 按位 和 +-*\/ 的优先顺序是怎么样的
优先顺序是,从左到右,左边的操作符先做,右边的操作符后做;对于一个算式中的所有操作符,要先做乘除,后做加碱。C语言中前++和—>的优先顺序->的优先顺序高于++(字首)C语言中&&和||谁的优先顺序大printf("%d",1||1&&0); 输出1C语言中,&和<<的优先顺序谁高?

c语言输入输出问题?
两个大于号为向右移位,同理,两个小于号为二进制向左移位。(即乘以多少或除以多少)例如:int main(){ int a = 16;cout<<(a<<4)<<endl;cout<<(a>>4)<<endl;\/\/但是a的值并没有改变 a >>= 1;\/\/此时a的值改变了 cout<<a<<endl;cin>>a;return 0;} 输入的结果分别为256,1;...

C++中&&左右如果没括号是要加空格吗?||左右没括号需要加空格吗?_百 ...
加空格吧,这样有两个好处,第一程序风格不错,看着清晰整洁。第二,不容易出现意想不到的错误,例如 a && b 如果不小心写成 a& &b,意思可能就变了,前者是a 与 b, 后者的意思可能就变成 a 和 b 的地址做与的位操作了。你可以研究研究C\/c++的编程规范,就像写作文有格式一样。

C语言中 移位 和 按位 和 +-*\/ 的优先级是怎么样的
在C语言中有两个单目和五个双目运算符。 符号 功能 + 单目正 - 单目负 * 乘法 \/ 除法 % 取模 + 加法 - 减法 下面是一些赋值语句的例子, 在赋值运算符右侧的表达式中就使用了上面的算术运算符: Area=Height*Width; num=num1+num2\/num3-num4; 运算符也有个运算顺序问题,先算乘除再算加减。单目正和...

相似回答