void main() { int a=45,b=4; printf("a左移b位的值是%d\n",a<<b); printf("a右移b位的值是%d\n",a>>b); }

答案是:a左移b位的值是720 a右移b位的值是2。怎么算出来的啊,求详细解释!

左移、右移是对二进制(是数据在内存中的存储方式)的位操作。
45是十进制整型数,在内存中占2个字节(即16位),其
对应的16位二进制数是 : " 0000 0000 0010 0111 ”

现在将其各个位的数向左移4位,前四位 " 0000 " 由于超出16位的范围而溢出,后4位空缺的添加上" 0000 ",最后得到16位二进制数 " 0000 0010 0111 0000 ",其对应的十进制数为720。

然后,下一个将45对应的16位二进制数向右移4位,前4位空缺就添上" 0000 ",后4位 " 0111 " 由于超出16位的范围而溢出,最后得到16位二进制数 " 0000 0000 0000 0010 " ,其对应的十进制数为2。追问

45化成二进制会是16位数,原因:是不是一个整数占两个字节,45是两个整数,所以是4个字节。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-07-22
45用二进制表示为 101101 左移4位也就是变成 1011010000 转换成十进制也就是720
右移四位也就是 000010 ,移出的部分直接去掉,前面添0.也即是十进制2.
第2个回答  2011-07-22
右移4位=将45×(2的四次方)=720
左移4位=将45/(2的四次方)=2(取整后所得)
右移n位=乘以2的n次方
左移n位=除以2的n次方
第3个回答  2011-07-22
a为45,二进制数是101101
a<<b:101101左移4位,得1011010000,即十进制数720
a>>b:101101右移4位,得10,即十进制数2
第4个回答  2011-07-22
右移4位等价于将45×(2的四次方)=720;
左移4位等价于将45/(2的四次方)=2(取整后)
右移n位等价于乘以(2的n次方)
左移n位等价于除以(2的n次方)
第5个回答  2011-07-22
换成二进制,然后进行位运算