首页 > 试题广场 >

函数a定义如下: int a(int tab){int n=

[单选题]
函数a定义如下: 
int a(int tab){
    int n = tab-1;
    n |= n >> 1;
    n |= n >> 2;
    n |= n >> 4;
    n |= n >> 8;
    n |= n >> 16;
    return n;
}
调用函数a(666)返回的结果是()
  • 1023
  • 1024
  • 666
  • 528
        想想按位或的特点是什么,原来是1的地方运算之后还是1,所以1只会多不会少,但是因为是使用了右移的结果进行运算,所以1最多也就填满传入的那个参数的所有bit,如果是左移不就最多可以把整个类型所占的bit全部置为1吗?所以只需要把665所占的bit数找出来,我们知道2^10=1024占11个bit即1 00000 00000,因为665小于1024大于512所以占10个bit,10个bit全1,当然是1023了。能用巧劲别下苦力啊亲们!重复事情应该交给机器来干,能靠巧妙的思维或辅以少量运算来做,实在想不到好办法才去硬算的题才是好题。如果是非要大量硬算的题,只能说明出题人水平才是真的不行,没搞清楚招聘的是程序员而不是计算机。
编辑于 2021-11-11 15:36:47 回复(9)
665二进制编码 0010 1001 1001
右移一位后为   0001 0100 1100(符号位为0右移不需要补符号位0)
按位与              0011 1101 1101
右移两位后       0000 1111 0111
按位与               0011 1111 1111
接下来的操作无济于事
结果就是0011 1111 1111 即 1023  
发表于 2021-07-22 09:56:46 回复(3)
<p>665的二进制表示为1010011001</p><p>右移一位为1101001100</p><p>按位或之后为1111011101赋值给n</p><p><br></p><p><br></p><p><br></p><p>把赋值后的n右移两位为1111110111</p><p>按位或之后为1111111111</p><p>之后就一直是1111111111也就是1023</p>
发表于 2020-08-06 13:53:41 回复(4)
排除法:经过这些或运算,n的值只增不减,因此排出CD,665最低位是1,无论怎么运算都是1,因此结果一定是奇数,1023
发表于 2023-06-09 17:02:13 回复(0)
不要被数字吓到了 比较位数就好🙃
发表于 2020-04-10 23:00:56 回复(0)
有符号数右移操作是算术右移操作
最高为根据移动后的最高位(符号为)进行补全。
eg:
1000 >> 1 -> 1100
011 >> 1 -> 001

可以参考:
编辑于 2021-02-19 20:16:03 回复(0)
一张图秒懂!666是介于512和1023之间的数,所以只需关注最高位第10位为1即可。

发表于 2023-12-18 22:15:16 回复(0)
(2^10)-1
发表于 2021-08-13 15:29:01 回复(0)
代码没有可读性的题目不值得我做
发表于 2021-06-16 15:57:17 回复(0)
这个怎么右移一位怎么判断是有符号数还是无符号数
发表于 2020-10-25 22:02:41 回复(2)
<p>一定是循环右移?不可能是665?</p>
发表于 2020-09-26 17:00:29 回复(0)