在 C++中,若变量 $x$ 为 int 类型且已被赋值为 $40$,则 x & (x - 1)的值为( )。
这题就是考位运算的底层逻辑。拿到题先别急着按计算器,脑子里把40的二进制写出来,看看减1之后发生了什么变化,再看看按位与会把哪些位清零。
最容易栽跟头的就是没把十进制转成二进制,直接拿40和39按位与,算出个乱七八糟的数(比如79这种明显不对的);其次就是误以为x-1会借位影响到高位,其实40的最后一位是0,减1只动最后一位,高位纹丝不动,按位与直接把那个0抹掉了。
这道题考查的是C++中的按位与运算(&)以及整数的二进制表示。命题人喜欢用这种‘看起来像陷阱’的表达式来测试你对底层数据结构的理解,而不是简单的算术能力。他们爱挖的坑就在于学生习惯用十进制思维去处理二进制操作,忽略了位运算只针对单个bit位进行。拿到题,第一步必须把十进制数x=40转换成二进制。40等于32加8,也就是101000。第二步,算出x-1,即39。39等于32加4加2,二进制是100111。现在关键来了,按位与运算是把两个数对应位同时为1才结果为1,否则为0。我们把101000和100111竖着对齐:101000和100111,从高位到低位依次看,只有最高位1和1碰头了,剩下的位要么是一个是0一个是1,要么两个都是0。所以结果就是100000,换算回十进制正好是32。这个32对应的是选项C。避坑方面,一定要记住x& (x-1)这个经典套路,它的本质是把x的二进制表示中最低位的1变成0。如果x是0,那x-1就是-1(补码全1),按位与结果还是0;如果x不是0,那结果就是x去掉最低位1后的值。这道题里40的最低位1就在32那个位置,去掉后剩下0,所以是32。从考频趋势看,这类位运算题目在近年CSP-J/S初赛和模拟赛中出现的频率在稳步上升,尤其是涉及二进制转换和简单位操作(如&、|、^)的题目,命题人越来越倾向于用这种‘短小精悍但需要动手转换’的形式来区分只会背公式的学生和真正理解计算机存储的学生。未来预测方面,鉴于gESP和NOIP真题中位运算的考查热度持续走高,且题干越来越简洁,可以合理推测未来几年这类题目仍会是高频考点,形式可能更加隐蔽,比如结合循环或数组下标运算,但核心依然是考查二进制转换和位操作逻辑。因此,看到这种题,脑子里立刻反应‘转二进制’,比硬算十进制靠谱一万倍。