展开全部
这里考查的是运算符的优先级
括号优先级最高,所以先看括号内部
/ 除法运算符的优先级比<<= 左移赋值优先级要高,所以先看2/a 结果为1,
a<<=1 就是 a=a<<1左移一位,因为初始 a是2,那么赋值后a是4
最后 4>>1 的值是 2
移位运算是根据2进制移的
比如 a =2 的时候,那么在计算机内存中,a就是(为了方便以8位来算,实际上现在的机器大部分是32位的,还有些是64位的,如果写成32位或者64位就太长了)
0000 0010 ,那么左移一位相当于
0000 0100 ,换算成 10进制就是4
移位这一块如果想了解的话可以自己去看一下书,相关的内容也是比较多的
比如数字在内存中是以补码的形式存在的,而不是正码或者反码,而且移位运算可以让一些计算变得很有趣,只不过理解这一块内容需要有一定的数学基础,比如你要计算 2^n ,也就是2的n次方,只需要 将1左移n就可以了 1<<n ——当然这个前提是不能够让数值超过机器所能表示的上限,比如在32位机下,1<<32那肯定会溢出的
括号优先级最高,所以先看括号内部
/ 除法运算符的优先级比<<= 左移赋值优先级要高,所以先看2/a 结果为1,
a<<=1 就是 a=a<<1左移一位,因为初始 a是2,那么赋值后a是4
最后 4>>1 的值是 2
移位运算是根据2进制移的
比如 a =2 的时候,那么在计算机内存中,a就是(为了方便以8位来算,实际上现在的机器大部分是32位的,还有些是64位的,如果写成32位或者64位就太长了)
0000 0010 ,那么左移一位相当于
0000 0100 ,换算成 10进制就是4
移位这一块如果想了解的话可以自己去看一下书,相关的内容也是比较多的
比如数字在内存中是以补码的形式存在的,而不是正码或者反码,而且移位运算可以让一些计算变得很有趣,只不过理解这一块内容需要有一定的数学基础,比如你要计算 2^n ,也就是2的n次方,只需要 将1左移n就可以了 1<<n ——当然这个前提是不能够让数值超过机器所能表示的上限,比如在32位机下,1<<32那肯定会溢出的
追问
问题1:这个移位是根据int的字节进行把,比如移1位就是1*2,对吗?
问题2:为什么左移是加而不是减呢,应该和数轴的方向一样吧?
追答
在没溢出的情况下,左移1位确定是 *2
二进制数字的表示方法其实跟十进制差不多,越往左的位数也就越大
比如十进制数字 12345,
1 2 3 4 5
万 千 百 十 个
所以,当 1往左移的时候,它所能代表的数值当然会越来越大
展开全部
(a<<=2/a)>>1
//先算2/a,表达式为:
(a<<=1)>>1
//再算a<<=1,即a=a<<1,a的值为1,表达式为:
1>>2
其值为2。
因此,最后a的值为1,表达式的值为2。
//先算2/a,表达式为:
(a<<=1)>>1
//再算a<<=1,即a=a<<1,a的值为1,表达式为:
1>>2
其值为2。
因此,最后a的值为1,表达式的值为2。
更多追问追答
追问
a=a>2为什么值是2呢?
追答
我写错了,改正如下:
(a>1
//先算2/a,表达式为:
(a>1
//再算a>1
其值为2。
因此,最后a的值为4,表达式的值为2。
a=a>2表示1左移2位,其值为0。
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
肢解
a<<=2/a 就是a=a<<(2/a) a被赋值为a乘以2的2/a次方,计算完a为4
在>>1 就是a除以2的1次方,计算完整个表达式为2
自己编译了一下结果还是2
#include <stdio.h>
int main(void)
{
int a=2,b;
b=(a<<=2/a)>>1;
printf("%d",b);
return 0;
}
a<<=2/a 就是a=a<<(2/a) a被赋值为a乘以2的2/a次方,计算完a为4
在>>1 就是a除以2的1次方,计算完整个表达式为2
自己编译了一下结果还是2
#include <stdio.h>
int main(void)
{
int a=2,b;
b=(a<<=2/a)>>1;
printf("%d",b);
return 0;
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
2017-12-30
展开全部
/ 除法运算符的优先级比<<= 左移赋值优先级要高,所以先看2/a 结果为1,
a<<=1 就是 a=a<<1左移一位,因为初始 a是2,那么赋值后a是4,
最后 4>>1 的值是 2
a<<=1 就是 a=a<<1左移一位,因为初始 a是2,那么赋值后a是4,
最后 4>>1 的值是 2
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询