首页 > 试题广场 >

如下函数,在32bits系统foo(2^31-3)的值是?(

[单选题]
如下函数,在32bits系统foo(2^31-3)的值是_______(这里的^是指数的意思)
int foo (int x)
   return x & -x
  • 0
  • 1
  • 2
  • 4
正数的补码与源码相同,负数的源码,等于反码加一,正数的反码与源码相同,负数的反码除一个1外,其余0和1互换
发表于 2017-04-18 10:51:49 回复(0)
更多回答
2^31 = 0,10000000,00000000,00000000,00000000(原码)
2^31-3 = 01111111,11111111,11111111,11111101(原码和补码相同)
-(2^31-3)原码 = 11111111,11111111,11111111,11111101(原码) 
-(2^31-3)补码 = 10000000,00000000,00000000,00000011(补码)
机器运算时是以补码形式计算的所以x & -x = 01111111,11111111,11111111,11111101 &  10000000,00000000,00000000,00000011 = 1
欢迎指正,谢谢!
发表于 2016-02-12 14:29:22 回复(5)
此题应该考虑符号位
2^31=10000000 00000000 00000000 00000000(这里的第一位是符号位,以补码形式存储,此时输出应该为-INT_MAX)
2^31-3=01111111 11111111 11111111 11111101(源码=补码,这里有两种思路理解:思路一:2^31-3不溢出,得到正数,思路二:两个补码相加)
-(2^31-3)=11111111 11111111 11111111 11111101(源码),1000000 00000000 00000000 00000011(补码)
两个补码做按位与后得到结果为00000000 00000000 00000000 00000001结果为1

编辑于 2016-03-25 20:01:20 回复(1)
1.   2^31-3   因为计算机只有加法运算,所以转化为
2.  (2^31)+(-3)    然后将其转化成二进制原码为
3. (10000000 00000000 00000000 00000000)原+(10000000 00000000 00000000 00000011)原   然后转化成补码,因为(10000000 00000000 00000000 00000000)是-INT_MAX,它只有补码形式,刚才的原码其实就是它的补码,所以式子可以转化为:
4. (10000000 00000000 00000000 00000000)补+(11111111 11111111 11111111 11111101)补   计算结果为:
5. (01111111 11111111 11111111 11111101)补  因为是正数,所以转化为原码为:
6. x=(01111111 11111111 11111111 11111101)原    然后x&-x可以转化为
7.(01111111 11111111 11111111 11111101)原&(11111111 11111111 11111111 11111101)原    与运算也需要变成补码来计算,所以转化为:
8.(01111111 11111111 11111111 11111101)补&(10000000 00000000 00000000 00000011)补   与运算结果为:
9.(00000000 00000000 00000000 00000001)补     转为原码:
10.(00000000 00000000 00000000 00000001)原   即十进制1,所以答案为1
发表于 2017-09-26 18:00:40 回复(2)
这题有个投机法,x一看就是奇数,其二进制形式的末位必为1,-x就是x取反加1,那-x的前面所有位都与x相反但末位为1,二者相与,前面就全0了,就剩最低位的1了
发表于 2017-07-30 14:37:59 回复(0)
这题直接 使用进制之间转换太麻烦,可以从简单的数字入手发现规律。
发表于 2016-06-22 13:58:33 回复(0)
2^31 = 01000000 00000000 00000000 00000000
2^31-3 = 00111111 11111111 11111111 11111101
-(2^31-3) = 11000000 00000000 00000000 00000011
x & -x = 1

发表于 2015-08-21 10:49:43 回复(3)
直接用3做例子不就好了么?
0011&1101不就是最后一位1么
发表于 2019-05-10 13:39:05 回复(0)
return x&(-x)相当于return x &(~x+1),相当于return x&1,所以return 1;
发表于 2017-07-07 13:45:23 回复(1)
2^31=1000000 00000000 00000000 00000000; 
3=0000000 00000000 000000000 00000011    反码:1111111 11111111 11111111 11111100    补码:1111111 11111111 11111111 11111101
x=2^31-3=0111111 11111111 11111111 11111101(原码)
                1000000 00000000 00000000 00000010(反码)
-x=1000000 00000000 00000000 00000011(补码)
x&-x=0111111 11111111 11111111 11111101 & 1000000 00000000 00000000 00000011
=1
发表于 2020-10-27 17:23:29 回复(0)
1.   2^31-3   因为计算机只有加法运算,所以转化为 ………………………………2.  (2^31)+(-3)    然后将其转化成二进制原码为 ………………………………3. (10000000 00000000 00000000 00000000)原+(10000000 00000000 00000000 00000011)原   然后转化成补码,因为(10000000 00000000 00000000 00000000)是-INT_MAX,它只有补码形式,刚才的原码其实就是它的补码,所以式子可以转化为:……………………………… 4. (10000000 00000000 00000000 00000000)补+(11111111 11111111 11111111 11111101)补   计算结果为: ………………………………5. (01111111 11111111 11111111 11111101)补  因为是正数,所以转化为原码为: ……………………………… 6. x=(01111111 11111111 11111111 11111101)原    然后x&-x可以转化为 ……………………………… 7.(01111111 11111111 11111111 11111101)原&(11111111 11111111 11111111 11111101)原    与运算也需要变成补码来计算,所以转化为: ………………………………8.(01111111 11111111 11111111 11111101)补&(10000000 00000000 00000000 00000011)补   与运算结果为: ……………………………… 9.(00000000 00000000 00000000 00000001)补     转为原码:……………… ……………… 10.(00000000 00000000 00000000 00000001)原   即十进制1,所以答案为1
编辑于 2020-02-27 22:46:26 回复(0)
首先2^31-3 是第32为0,然后就是前31位除了第二位为0外都为1
    因为前31位都为1就是2^31-1,再减一个1就是2^31-3。
它的负号就是 -2^31+3。第32位为1,然后再加一个3,即第二位和第一位都为1。
两者相与得到1
发表于 2019-04-26 11:12:26 回复(0)

这题其实非常简单,x是原码存储,-x是补码存储,补码是反码+1,2^31-3最低位肯定是1反码变0,+1之后为1,没有造成进位,那么其他位上都还是取反状态,与运算之后都为零,只有第一位,与运算之后为1,所以结果为1

发表于 2018-07-09 09:09:46 回复(1)
为什么我用vs2010跑出来的结果是2?
发表于 2018-04-26 11:17:18 回复(0)
以前的简答都是 先计算 2^31 -3,而这个问题明明就不是考你如何去计算2^31 -3  ,而是考在计算机中互为相反的两个数相与之后的结果,所以就就简化为1 & -1 的问题,-1的补码就是反码加一,1的补码就是1的原码,所以最后的结果是1.  
发表于 2018-03-13 09:35:46 回复(0)
在计算机中,负数以其正值的补码形式表达
原码:一个整数,按照绝对值大小转换成的二进制数,称为原码。
反码:将二进制数按位取反,所得的新二进制数称为原二进制数的反码。
补码:反码加1称为补码。

1)负数的右移:负数右移的话,由于要保持它是负数,所以负数的二进制的右边补1。如果一直右移的话,最后就就变成0xFFFFFFFF 即-1
如: -4>>1 为-2 ;-4>>2为-1

2)负数的左移:跟正整数左移一样,右边补0,一直左移的话,最后就是0啦。-2<<2 为-4 ; -2<<31为0

发表于 2018-02-28 20:47:19 回复(0)
2吧
2^31-3这个表达式看成2的31平方减3就错了。实质^是异或 ,—比^优先级高,所以2^(31-3)=2^28=30
发表于 2015-09-11 20:05:11 回复(4)
利用奇偶数,最后一位是一,负数取反加一最后一位仍是一,与之后还是一
发表于 2021-03-17 08:04:07 回复(0)
牛里格村那个高赞答案是错的,他家电脑33位的系统。第二高赞才是对的。
发表于 2020-10-02 23:53:10 回复(0)
试了一手2^5-3 & -2^5+3 算出来得1 就选了1
发表于 2019-03-12 19:58:25 回复(0)
非常难 我不懂 需要仔细理解
发表于 2019-03-05 23:14:34 回复(0)