c++中的位运算计算问题

a=1,b=2,c=3求以下的各式的结果?①a|b-c ②a∧b&-c请写出详解解答过程。谢谢~

首先你要清楚整型数据在内存中是怎么存取的,内存中存的都是该数的补码形式,规则:正数的补码就是该数的二进制形式,负数 的补码:将该数取反,等到该数的绝对值,然后将绝对值按位取反,即:1变成0,0变成1,然后在加1,比如:求-1的补码,-1的绝对值是1,1的二进制是00000000000000000000000000000001,然后按位取反,得:1111111111111111111111111111110,最后再加个1,就是0xFFFFFFFF,a|b-c,这要考虑到运算符的优先级问题,乘除求余的优先级大于加法减法,加法减法大于与运算,与运算大于异或运算,异或运算大于或运算,现在再来看你的问题,a|b-c:先做减法b-c,得-1,然后再与1做或运算,得到-1.a^b&-c,表达式里面-的优先级最高,然后是&,所以先做b&-c,根绝上面的计算出2与-3的补码,然后再做与运算,得到结果0,然后再与a做异或运算,得到结果为1,不对之处,望指出
温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-01-05
对于正数,该数原码和补码相同,对于负数其补码的求解遵循以下步骤
(1)求出该数的绝对值的二进制原码。(2)求原码的反码:把各位的1转化为0,0转化为1。如果原码为111101,其反码为000010。(3)将反码加1,即是原码的补码,加法遵循二进制加法。将上述反码加1,即000011.
a的二进制原码为00000000 00000001 (一共16位,为便于查看位数中间用空格标记),b的原码:00000000 00000010,c的原码为00000000 00000011。-c的原码:先求原码即c的原码,再求反码:11111111 11111100.最后求-c的原码:11111111 11111101.

求a|b即是a和b的补码的每个二进制位析取后的结果(即通常所说的”或“)结果:00000000 00000011,然后减去c的补码(二进制减法)得:00000000 00000000,化成十进制为0。

∧是按位异或符号:运算规则:0^0=0; 0^1=1; 1^0=1; 1^1=0。a∧b=00000000 00000011

&按位与运算符:运算规则:0&0=0; 0&1=0; 1&0=0; 1&1=1;上述a∧b的结果与-c按位与得

00000000 00000001,化成十进制为1;
这个求解的过程需要用到二进制、十进制的相互转化;具体你可搜百度百科:进制间的转化,里面的介绍十分详细。
希望我的解答能够对你有所帮助!!
第2个回答  2013-01-05
这种问题得先弄明白运算符的优先级。
第一题,减号优先级高于或运算,b-c=-1,1|-1,计算机是用补码格式存储的,如果是int型32位,-1的补码是FFFFFFFF,1的补码是00000001,或运算之后,还是FFFFFFFF,因此第一题结果为-1.
第二题,先 - 再&最后∧,2&-3,同样补码运算,是00000002&FFFFFFFD,结果为00000000,也就是结果为0.
第3个回答  2013-01-05
@1
位操作就是对每个二进制位进行逻辑操作的结果,01 10 每位取或的话 是 11 就是3 再减c 就是0了
@2
^ 按位异或 若参加运算的两个二进制位值相同则为0,否则为1
& 位且 00000010 (2) 100000011(-3) 的话就是 000000010 结果是2
再 1^2 就是 01 10 每位都不同所以 是 11 也就是 3
第4个回答  2013-01-05
a|b-c= 1|2-3=1|-1=-1;
a^b&-c=1 ^2 & -3 =1^ 0 =1
负号优先级最高
&优先级比^高

-3 =0xffff fffd
2 =0x0000 0002
//2进制

//2&d =0010 & 1101 =0本回答被提问者和网友采纳
相似回答