任意整数 $a$ 的二进制反码与补码都有 $1$ 位不同。( )
这题考的是补码定义与反码的关系。拿到题别急着背结论,先想补码怎么算:反码加1。再想加1会翻哪些位——末尾一串1会进位,每进一位就翻一位。所以只要看原数末尾有多少个1,就能判断差几位。
最容易掉进命题人的坑就是死记“反码与补码差1位”,却忘了验证边界。比如8位补码最小值-128,它的反码是01111111,加1后变成10000000,7位全不同,差7位不是1位。还有负数范围里,除了-1(反码全0)这种特例,其他负数末尾至少有两个1,进位会让多几位翻转,差值肯定大于1。做题时千万别只看正数或普通负数,一定要拿极端值试一下。
【考点】二进制反码与补码的定义及运算关系
【概念梳理】 反码是对二进制数按位取反(0变1,1变0)得到的数;补码是在反码的基础上加1得到的数。因此,补码与反码的差异,本质上就是“加1”这一运算在二进制下翻转了哪些位。
【命题视角】 命题人专门挖“任意整数”这个坑。学生往往只想到0或-1这种简单情况,觉得反码全0,补码全1,差1位,就以为结论成立。但题目说的是“任意整数”,必须考虑所有可能,尤其是负数的极端情况。
【思考心法】 拿到题先想:补码 = 反码 + 1。加1会让最后一位从0变1,如果最后一位本来是1,就会向高位进位,每遇到一个1就翻转一次。所以,反码与补码有多少位不同,就等于“加1”这个操作翻转了多少个位。
【具体推导】 设原整数为a,其二进制表示为b。反码为~b,补码为~b+1。 ~b+1与~b的差值,就是~b末尾连续1的个数。 因为~b是b的反码,b末尾连续1的个数,就是~b末尾连续0的个数。 所以,反码与补码差值的位数 = b末尾连续0的个数。
现在看“任意整数a”:
综上,不存在“任意整数a”的反码与补码都只有1位不同的情况。题干说“都有1位不同”是错的。
【避坑提醒】 别被“补码=反码+1”这个公式迷惑,以为只翻1位。进位传播是关键。一定要拿极端值(如-128、-1、0)验证,才能发现命题人的陷阱。
【考频与趋势】 根据题库数据,C++程序设计共考过261题,其中GESP三级考了82题,占比约31.4%;基础语法共考过1295题,GESP三级考了215题,占比约16.6%。二进制表示相关考点在GESP三级中属于高频内容,近五年(2020-2024)每年均有出现,2024年C++程序设计考题数量达103题,为近年峰值,说明该级别对底层二进制运算的考查力度正在加大。
【预测】 基于当前考频趋势,二进制反码与补码的运算细节(尤其是进位传播和边界情况)在未来GESP三级考试中仍将是高频考点,命题人可能会继续用“任意整数”这种全称量词来设置陷阱,要求学生必须考虑所有情况。暂无足够依据预测具体题型变化,但建议重点复习负数边界和进位传播机制。