首页 > 试题广场 >

将逻辑代码: int x = ...; if (x % 2)

[单选题]
将逻辑代码:
int x = ...;
if (x % 2) {
    return x - 1;
} else {
    return x;
}
用表达式:return x & -2; 替代,以下说法中不正确的是( )
  • 计算机的补码表示使得两段代码等价
  • 用第二段代码执行起来会更快一些
  • 这段代码只适用于x为正数的情况
  • 第一段代码更适合阅读
代码的本意是返回偶数
计算机内部表示的整数的方式为补码,正数为自身,负数为符号位不变其余各位取反加1
理解本体分两部分:
1)-2的补码为1111,1110,正数与-2相与很明显就是使整数变为2的整数倍(相当于减一)
2)负数时,当负数为偶数时,补码的最后一位比为0,与-2相与仍为自身;当为奇数时,补码的最后一位比为1,与-2相与时其它位不变最后一位为1,此时根据负数到源码的转换规则,各位取反加1,此时相当于加上-1
发表于 2016-05-03 15:00:51 回复(2)

正数的补码就是其本身

负数的补码是在其原码的基础上, 符号位不变, 其余各位取反, 最后+1,
以8位字长为例(64位也一样)
-2 =(1000 0010)原 = (1111 1101)反= (1111 1110)补
源代码表示末位不为1时将会减1,否则返回源码,这与-2的补码相与的结果是相同的。
发表于 2015-08-08 17:24:46 回复(7)
@squirrel 的解析非常清楚,但是最后一句话“源代码表示末位不为1时将会减1 ”应该是说错了吧,搞得我理解了好久,应该说成“源代码表示末位为1时将会减1 ”吧。
发表于 2015-08-20 16:07:15 回复(8)
原题,就是判断x是否为偶数
是,则返回x
否,返回x-1,,,还是一个偶数。
而-2在计算机存储为1111 1111 1111 1110,x与之与运行一下,即可实现原题意。
发表于 2017-03-02 11:32:41 回复(0)
首先弄清楚源代码的含义是:返回偶数; 偶数:本身,奇数:末位-1
直接举例:
如 -3 & -2    
-3(8位定长)的补码为:1111 1101  -2的补码为: 1111 1110   相与得: 1111 1100   此数就是-4的补码;可以验证:除符号位外按位取反末位加一 变为源码读数为-4  自己可以做一下偶数&-2
计算机内部只存在补码, 若x为偶数,则其补码末位为0   x&-2 仍为本身    若x为奇数,则补码末位为1, x&-2末位减一,其余位不变,相当于x-1的补码
发表于 2020-04-08 22:50:45 回复(0)
因为-2的原码是10000..010。补码是11111..110,
当x是正数时,偶数不变,奇书&后减1,与逻辑一样
当x是负数时,偶数补码末尾为0,还是不变。奇数补码末尾为1,&后为0.然后考虑x-1,与x相比就是末尾为0,说明前面&后就变成了x-1的补码了,所以与逻辑还是一样的。
发表于 2017-08-05 17:50:58 回复(0)
计算机中整数都是以补码存在
-2的原码(2的原码为0000 0010),则-2的原码为1000 0010;-2的反码1111 1101;-2的补码1111 1110;
1.X为非负整数(除0以外,原码、反码、补码都一样),如果X为正偶数,其二进制末位数必然为0,再和-2相与,仍是其本身;如果X为正奇数,其二进制末位数一定为1,再和-2相与,X的二进制的末尾1和0相与为0,也就是说X减1·,变为正偶数
2.X为负数,如果X为负偶数,其二进制末位数必然为0,再和-2相与,仍是其本身;如果X为负奇数, 其二进制末位数一定为1,再和-2相与,X的二进制的末尾1和0相与为0,负数的补码转换成原码的时候,符号位不变,按位取反,末尾加1;(假设X补码是1111 0101,X表示负数-11,1111 0101与1111 1110进行按位与操作,结果是1111 0100,补码1111 0100按位取反,符号位不变,得到反码1000 1011,末位加1,符号位不变得到原码1000 1100;其代表十进制-12)仍是X-1的结果,X变为负偶数
发表于 2017-05-09 13:18:55 回复(1)
A.题目代码表示如果x末位是1,返回x-1,否则直接返回x。
    -2 = (1000 0010)原码 = (1111 1101)反码 = (1111 1110)补码。
    x & -2实际上和题目代码功能一样。
B.位运算符比+-*/%效率要高。
C.-2 % 2=0。取模:求余数,适用于正数、负数和0。必须是整数。
D.当然是第一段代码容易看懂了。。。
发表于 2020-05-15 23:32:08 回复(1)
答案应该A吧,正数负数0都可以,举例-1&-2 = -2;-2&-2 = -2,和题干输出一致。所以证明C肯定是错的
发表于 2020-03-15 10:57:52 回复(1)
b
发表于 2019-04-28 14:53:40 回复(0)
这道题确实只能是X为正数 的情况
发表于 2019-03-05 11:08:34 回复(1)
x & -2; 换一个写法:x & 0xFFFFFFFE; 也就是最后一位与0取&,结果最后一位肯定为0;也就是偶数了;不过,根本的,-2表示为0XFFFFFFFE的原因还是负数的补码的求法:负数,(操作其正数)最高位为1,其余位取反,然后+1
发表于 2018-02-20 17:36:35 回复(0)
用0排除
发表于 2017-03-04 12:24:00 回复(0)
负数的补码是在其原码的基础上, 符号位不变, 其余各位取反, 最后+1,
以8位字长为例(64位也一样)
-2 =(1000 0010)原 = (1111 1101)反= (1111 1110)补
源代码表示末位不为1时将会减1,否则返回源码,这与-2的补码相与的结果是相同的。
发表于 2016-06-01 10:11:12 回复(0)
第一段代码表示:若x为偶数,返回x-1,若为奇数,返回x,在二进制中表示就是,x为偶数则将最后一位置为0,x为奇数,不变
第二段代码 x&-2 表示:-2低8位用二进制表示1111 1110 ,显然x&-2的结果仅仅改变x二进制表示的最后一位,与第一段代码等同
发表于 2016-03-19 11:51:51 回复(1)
正数和负数都可以的。
发表于 2015-04-24 14:42:27 回复(0)
答案  C  
发表于 2015-01-09 15:38:47 回复(1)