关于位运算【目测应该长期更新】

今天在做 POJ 3279 的时候 ,遇到了位运算;

大概介绍一下吧:

1.因为机器内部运算都是二进制运算,而我们是通过进制转换再运算的,故,直接利用机器内部二进制运算会相对于效率高一些;

2.在BFS中进制反转类问题,前提在矩阵中只有 0  和   1 的时候才可以使用;

3.摘取自百度的图。常见的位运算符号;

4.下来列举常用的几种:(这里针对C语言和C++语言符号)

(1) a&b;

&运算通常用于二进制取位操作,例如一个数 &1的结果就是取二进制的最末位。这可以用来判断一个整数的奇偶,二进制的最末位为0表示该数为偶数,最末位为1表示该数为奇数。

相同位的两个数字都为1,则为1;若有一个不为1,则为0。
00101
11100
(&;或者and)
----------------
00100

(2)a|b;

 |  运算通常用于二进制特定位上的无条件 赋值 ,例如一个数 | 1的结果就是把二进制最末位强行变成1。如果需要把二进制最末位变成0,对这个数  | 1之后再减一就可以了,其实际意义就是把这个数强行变成最接近的偶数。
相同位只要一个为1即为1。
00101
11100
(|或者or)
----------------
11101

(3) a^b;

异或的符号是^。按位异或运算, 对等长二进制模式按位或二进制数的每一位执行逻辑按位异或操作. 操作的结果是如果某位不同则该位为1, 否则该位为0.
xor运算的逆运算是它本身,也就是说两次异或同一个数最后结果不变,即(a xor b) xor b = a。xor运算可以用于简单的加密,比如我想对我MM说1314520,但怕别人知道,于是双方约定拿我的生日19880516作为 密钥 。1314520 xor 19880516 = 20665500,我就把20665500告诉MM。MM再次计算20665500 xor 19880516的值,得到1314520,于是她就明白了我的企图。
相同位不同则为1,相同则为0。
00101
11100
(^或者xor)
----------------
11001







你可能感兴趣的:(关于位运算【目测应该长期更新】)