先来复习一些位操作与逻辑操作;
逻辑操作:
!— 返回值为true/false。非0,返回true;非非零,返回false;
&&—返回true/false。真&&真,返回true,其余返回false;
系统自动判定,左值为false直接返回false;
||—不在赘述。
位操作:>>:右移,相当于除以一个数;涉及到最高位补零补一的问题;
<<:左移,乘以一个数;右边空位始终补0;
^:按位异或,相异取1,相同取0;
~:按位非,1变0,0变1;
三题中,容易也是比较典型的是2.64
思路比较直接:将无关位全部换为1,之后按位取反,再取非;若是奇数位都为1,则必将返回1;
这里郑重的介绍两个中流砥柱:
&—按位与;与1是拷贝,与0是重置;
|—按位或;或0是拷贝,或1是置1;
于是在这里我们这样操作: !~((0xAA AA AA AA) | x)
2.61也是这样操作。只是先用>>将最高位换到最低位有利于操作;
2.62就是在验证算数运算还是逻辑运算。需要注意:只有在有符号数负数移位时,最高位才可能补一。同时,在分析符号的变化时,要留心机器是通过补码运行的。于是我们这样做:return (-1>>1) ==-1;
从机器的视角:(假设为16位机) 1000 0000 0000 0001(原码)——>
1111 1111 1111 1111(补码)——>(开始操作,设当前环境为算数右移)
1111 1111 1111 1111 依旧是-1;