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

#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]);
}

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

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

 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

图片说明

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

return !(i & 0x1);
return i - (i >> 1 << 1) - 1;

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