你如果是为做题,没有心算的必要吧~毕竟是为了拿分,笔算更靠谱,拿得稳,干什么不用?
在实际应用中,不会出现类似什么 “432423 & 342324” 得几这种问题的。
只有当问题本身就是按位定义的情况才会使用位运算。比如,文件的读写标识也许可以这样定义,以用一个数表示:
它的每个二进制位分别用与表示 binary read write append truncate 这些属性。
那么一个可读可写的文件就可以表示成 0 1 1 0 0。(如果看成十进制是 12,反而比较费解。)
一个写追加的文件就是 0 0 1 1 0。(这个是 6,十进制也不直观)
定义能看明白了吧?
现在有个问题,已经有一个文件了,希望它变成可写的,而不改变其它状态。那么应该如何做?
直观的想法就是把第三位变成 1,其它不动就行了。怎么做这件事?
? ? ? ? ? | 0 0 1 0 0 = ? ? 1 ? ? 就可以。
写成 c 语言,如果 flags 是记录属性位的,那么 flags = flags | 0x4 (或者直接 flags |= 0x4)就可以了。
想去掉可写怎么办?看这个:
? ? ? ? ? & 1 1 0 1 1 = ? ? 0 ? ?
神奇吧,而且 1 1 0 1 1 = ~ 0 0 1 0 0。
想知道一个文件是否可写,用
? ? ? ? ? & 0 0 1 0 0 是否非零就可以验证。
类似还可以做很多事,都比用十进制方便。
一种很常见的编程技巧是用宏:
#define WRIITE 0x0004
那么就可以用 flags |= WRITE 或者 flags &= ~WRITE 这样的写法了。
不仅可读性高,而且不容易写错。将来想增加新位,或改旧的,只用在宏上下手。
位运算不是你想的那么用的。虽然书上讲定义的时候,要用数学那种抽象的讲法来搞。但用的时候,人们只是利用它的直观性。