2 daxiazaiwusi daxiazaiwusi 于 2016.03.05 18:34 提问

求讲解,这个函数的意思是什么呢?

#include
int oushu(int i)
{
return i - (i >> 1 << 1) - 1;
}
int main()
{
int x[] = {0,1,2,3,4,5,6,7,8,9,100,101};
for(int i=0;i<12;i++)
if (oushu(x[i]))
printf("%d ", x[i]);
}

6个回答

caozhy
caozhy   Ds   Rxr 2016.03.05 18:39
已采纳

return i - (i >> 1 << 1) - 1;
(i >> 1 << 1就是
i / 2 * 2,其中/是整除
如果是偶数,那么这个结果和i相等,否则是i-1
所以如果是偶数,返回-1,如果是奇数,返回0

fateflv
fateflv   2016.03.05 22:44

图片说明

caozhy
caozhy 赞,这个回答比我详细
接近 2 年之前 回复
fateflv
fateflv 回复fateflv: 一般默认的情况虽然可以把 i >> 1 << 1 当做 i / 2 * 2来理解,是因为在定义 / 这个符号是取整的,但是如果当初定义的/不是取整的话,那这样理解就不正确了。这道题目之所以用位移符号来写,而不是用 return i - i / 2 * 2 - 1来写,就是要考你对位移运算的理解。
接近 2 年之前 回复
fateflv
fateflv 之前两条评论是不小心按了回车,没想到不能回车的~~ 前面那些前辈们说 i >> 1 << 1 就是 i / 2 * 2是不正确的。你代一个数进去就知道了,如当 i=5 时,若真像他们所说的相当于 i/2*2,那么 return i - (i >> 1 << 1) - 1;就是return 5-5-1了,即return -1了。 回到main函数里面,if(-1)这样的情况它又是怎样执行的?所以,想一下就明白了。
接近 2 年之前 回复
fateflv
fateflv 前面那些前辈们说 i >> 1 << 1 就是 i / 2 * 2是不正确的。你代一个数进去就知道了,如当 i=5 时,若真像他们所说的相当于 i/2*2,那么
接近 2 年之前 回复
fateflv
fateflv 前面那些前辈们说 i >> 1 << 1 就是 i / 2 * 2是不正确的。你代一个数进去就知道了,如当 i=5 时,若真像他们所说的相当于 i/2*2,那么
接近 2 年之前 回复
u013596119
u013596119   Rxr 2016.03.05 18:44

i>>1是二进制向右移动1位,<>1<<1)如果等于0则为偶数,等于1则为奇数,那最后-1,如果是返回-1为偶数,返回0为奇数,-1为true,0为false

u013596119
u013596119 看下面一条吧。。。这条的“《《符号”被html解析了。。。。
接近 2 年之前 回复
u013596119
u013596119   Rxr 2016.03.05 18:45
 i>>1是二进制向右移动1位,<<1是先左移动1位,二进制数1结尾那么10进制就是奇数,0结尾10进制就是偶数,所以偶数向右移动1位向左移动一位之后二进制保持不变(比如2是10(2),向右先,变1,向左之后,变回10),而奇数则比原来少了二进制的1,比如3:11(2),向右变1,向左变10,这样i-(i>>1<<1)如果等于0则为偶数,等于1则为奇数,那最后-1,如果是返回-1为偶数,返回0为奇数,-1为true,0为false
WinsenJiansbomber
WinsenJiansbomber   2016.03.06 10:59

这不是求偶吗,哈哈。不过算法有点复杂,下面两个表达式效果一样:

return !(i & 0x1);
return i - (i >> 1 << 1) - 1;
u013344915
u013344915 这种写法就清晰很多,好代码就是地球人都容易看懂的代码。
接近 2 年之前 回复
u010514517
u010514517   2016.03.17 14:56

判断是否是偶数,是返回0不是返回-1

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!