又三道C语言的求值问题

来源:百度知道 编辑:UC知道 时间:2024/05/28 13:45:39
一道:
int i=2,j=1,k=3;
(i+j)&k

两道:
int a=13,b=6;
~a<<2和a|b

三道:
int a=1,b=2,c=3,d=5,m=1.n=1;/*我也不知道为什么有m和n,题目就是这样的*/
a||b+c&d-c

请分别解释过程,谢谢~~
初学者,见谅,顺便解释一下&和|的意思,我只知道1&0,0&1和0&0等于0,1&1等于1这些基础的,至于别的数字参与&和|的计算,我就不知道怎么处理了。
还有对于<<和>>,是不是把数字转化成二进制以后左右移位,然后再转化回原来的进制?还是别的方式计算的?
a为0000 0000 0000 1101
b为0000 0000 0000 0110
a|b是按位或,应该是0000 0000 0000 1111吧,为什么你算出来的是0000 0000 0000 0100呢?

第二题答案是-56和15。。。

第三题的答案是1,我做出来的也是-1,但是答案是1,我也不知道为什么。

还有,&&和||也是按位与或么?还是?麻烦了~~

一道:
int i=2,j=1,k=3;
(i+j)&k
2+1=3 二进制代码
0000 0000 0000 0011
3的二进制代码恰好一样 所以按位取与一下以后一样
还是3

两道:
int a=13,b=6;
~a<<2和a|b
先求~a a为0000 0000 0000 1101
~a为1111 1111 1111 0010
左移两位后
1111 1111 1100 1000
由于在内存中数据都是按补码存放
所以接下来要把该数据转换成原码
方法是-1再按位位取反当然符号位1代表是符号不变
1111111111000111 符号位不变按位取反1000 0000 0011 1000
所以是-56
b为0000 0000 0000 0110
a|b是按位或 是0000 0000 0000 1111
答案就是15

三道:
int a=1,b=2,c=3,d=5,m=1.n=1;/*我也不知道为什么有m和n,题目就是这样的*/
a||b+c&d-c
a||b的值为真 所以是1
c&d是0000 0000 0000 0011
0000 0000 0000 0101
0000 0000 0000 0001
是1
所以应该是 1+1-3答案是-1
&是按位取与只有有一个0就是0
|是按位取或 只要有一个1就是1
别的数字都先要转成二进制来计算
<<或>>移位后还是一般要按照原进制来表达
具体还是要看题目要求

||是逻辑或&&是逻辑与
第三题我运行下等等
第三题的问题是优先级 应该先计算c&d
0000 0000 0000 0011
0000 0000 0000 0101
0000 0000 0000 0001答案是1