位移位操作中叠加NOT(~)的运算规则及(1010 & ~(1 << 3))计算疑问
位运算表达式分步推导与常见误区纠正
两个核心认知偏差说明
- 第一处推导失误:你认为
1 << 3的结果是0000,这和实际移位规则不符。左移运算的逻辑是把二进制所有位向高位方向移动指定位数,低位补0,移出字长范围的高位直接丢弃。在本题默认的4位二进制语境下,1的二进制是0001:- 左移1位得到
0010 - 左移2位得到
0100 - 左移3位得到
1000
只有当左移位数达到4位时,原本最低位的1才会被移出4位的范围,最终得到全0的0000。出现这个判断偏差,大概率是把左移和右移的移动方向搞反了——只有1 >> 3(右移3位)才会让1持续往低位移动,最终得到0000。
- 左移1位得到
- 第二处逻辑对应偏差:你对取反结果的判断规则本身是成立的——对全0做按位取反会得到对应字长下的全1,但因为第一步的移位结果判断错了,后续的推导链条自然就偏离实际了。
这里也直接回应你最初的疑惑:如果移位操作真的得到了全0的结果(比如4位语境下把1左移4位),那在对应字长下对全0做按位取反,确实会得到全1的
1111,这个逻辑本身是自洽的。
全表达式完整计算(4位无符号数作业题语境)
位运算的优先级从高到低为:移位运算 > 按位取反 > 按位与,因此计算顺序严格按照括号嵌套从内到外执行:
- 计算最内层的
1 << 3,得到4位二进制结果1000 - 对上述结果执行按位取反
~1000,逐位翻转0和1,得到4位结果0111 - 最后执行按位与运算
1010 & 0111:逐位对比两个数的每一位,只有两个位同时为1时,对应结果位才为1,最终得到结果0010
按位取反运算的核心规则补全
很多新手在叠加移位和取反操作时容易踩坑,需要明确两个关键规则:
- 按位取反的结果完全依赖当前运算的字长,不存在脱离位宽的通用取反结果。同样是对
1 <<3的结果(也就是仅第3位为1的二进制数)取反:- 4位字长下,结果为
0111 - 8位字长下,原数是
00001000,取反后为11110111 - 常规32位整型语境下,原数是仅第3位为1的32位二进制数,取反后是除第3位为0、其余所有位都为1的数值
- 4位字长下,结果为
- 不要混淆按位取反
~和逻辑非!:!是逻辑判断类操作,对非0值取反返回0,对0取反返回1;但~是逐位翻转每个二进制位的状态,二者运算逻辑完全不同。
内容的提问来源于stack exchange,提问作者Jack Facer
相关产品推荐
相关产品推荐

