c语言移位运算?
1<<5,表示左移五位,结果是100000,因为c语言是从0 计数的,所以后面5个0.对应8位寄存器就是xx100000。(~(1<<5)),表示左移五位再取反,结果是011111.对应8位寄存器就是xx011111。右移是一样的道理。
c语言中右移3位什么意思?
对于无符号整数,右移可以直接看做是除以2的n次方的运算,且有整数除法的概念,低位移出去的位全部丢弃。
举个简单的例子来说,十进制的5对应的二进制的表示为101,它右移1位得到的数会是2,也就是二进制表示的10,右端的1直接被丢弃掉了。
c语言中从右向左的运算符有哪些?
1、结论
左移运算符(<<)
右移运算符(>>)
2、拓展
1、左移运算符
格式:a<<b
将a这个数的各二进制位左移b位,要求b必须是非负整数,移动过程中,右边空出的位用0填补,高位左移溢出则舍弃该高位。
举例来看:
a=5,二进制位:0000 0000 0000 0000 0000 0000 0000 0101
a<<3后结果为:0000 0000 0000 0000 0000 0000 0010 1000
即,右边空出来的三位补0,左边的0都舍弃,左右两边的三个0没有关系。
2、右移运算符
格式:a>>b
将a这个数的各二进制位右移b位,要求b必须是非负整数,移到右端的低位被舍弃。其中,①对于无符号数,高位补0;②对于有符号数,如果采用算术移位,则空出部分用符号位填补,如果采用逻辑移位,则用0填补。
举例来看:采用算数移位
a=-5,其二进制位:1111 1111 1111 1111 1111 1111 1111 1011
a>>3后的结果为:1111 1111 1111 1111 1111 1111 1111 1111
即,-5为负数,它的符号位为1,因此左边填补三个符号位1,右边011依次被移出而舍弃。
C语言程序中,使用移位操作代替乘除运算,真的效率更高吗?
你说的对,在计算机中的数字都是二进制数,即是由0和1组成的,在计算机中二进制数的乘除运算有时比加减运算还要快,原理上,二进制数的乘法乘2就是整个数左移一位,除2就是整个数右移一位,就完成了。用的时间就是一个指令周期,如果你在程序中使用十进制表达式,在程序执行时要先将十进制数变成二进制数,然后再进行二进制数的乘除运算,时间上要多得多。所以,在用C语音编程时,如果直接用二进制数移位算法来执行乘除,速度上要快很多。这是C语音编程的一个优点。
我们目前使用的x86cpu,都属于复杂指令集的cpu,这种cpu的移位指令的指令执行周期为一个时钟周期,而乘法指令是多个时钟周期(具体多少忘了),也就是说执行一个乘法指令可以执行多个移位指令,所以移位指令比乘法指令快,但移位指令只能执行乘或除2的整数次方的运算,而且还有高位或低位被移出(跟移位方向有关),所以只能有限的用,否则会弄巧成拙。
对于c语言为什么移位比乘除快来谈谈我的看法,以前接触过低端单片机,低端单片机底层硬件对移位和乘除的处理是这样的,单片机对移位的操作是单片机内部有一个移位寄存器,而移位就是数据在寄存器里左移或者右移,数据的左移就是除以2,数据的右移就是乘以2,也就对应寄存器的左移和右移操作,所以移位和乘除有某种联系,即移位是乘除的一种方式。并且移位用到了一个寄存器,不需要经过ALU(算术逻辑单元)的运算。对于不是移位的乘除来说不仅要用到多个寄存器,而且还要经过算术逻辑单元的运算,加载寄存器需要时间,算术逻辑单元的运算也需要时间,很明显,用到一个寄存器的移位运算比用到多个寄存器和算术逻辑单元的乘除运算所需时间更少,即移位运算比不是移位的乘除运算快。