以下我所说的都是位操作,都转化成2进制情况下。
1.位与操作&
与操作数的第n位如果都是1,那么结果的第n为也为1,否则为0。
2.位或操作|
与作数的第n位只要有一个是1,那么结果的第n为也为1,否则为0。
3.位异或操作^
与操作数的第n位相反,那么结果的第n为也为1,否则为0,ps:0^任何结果都是其本身。
4.位非操作~是一元操作符
操作数的第n位为1,那么结果的第n位为0,反之
5.左移操作<<
就是把操作数往左边移动几位,低位补零。
ps:我下面说的案例是在无符号的情况下。
当然这些概念上的只是一个开场白。
我想说的实际上的用法,咳咳(和各位大牛的语气一样)。
现在我们有个需求,我有很多个开关,组成的一串数字,0代表关,1代表开。
0000 0000 0011 0000 1000 0000 0001 0000
1、需求来了,我现在想让第3位开着(A|=B),这时候我先找到第3位,这个时候我们就需要个临时变量来作左移操作1<<3;
0000 0000 0000 0000 0000 0000 0000 0001
结果:0000 0000 0000 0000 0000 0000 0000 1000
根据上面的描述操作,拿到这个位数的时候在用这个开关去和这个左移的操作去|下,就能让第3位置为1(其实我不管ta曾经是什么样子的,如果不是1,我就整成1,是1那就委屈下)。
0000 0000 0011 0000 1000 0000 0001 0000
0000 0000 0000 0000 0000 0000 0000 1000
根据结果:0000 0000 0011 0000 1000 0000 0001 1000
2、现在我们要验证下,是否已经打开了这个开关(A&B),我们就判断下这个开关&操作下1<<3如果是0就是没打开(其实如果是1<<3本身就是打开了).
0000 0000 0011 0000 1000 0000 0001 1000
0000 0000 0000 0000 0000 0000 0000 1000
根据结果:
0000 0000 0000 0000 0000 0000 0000 1000
3、我要让某个开关关掉,就比较绕了(A&=~B)。
首先把标志位取反,然后在去位于就可以了,先~(1<<3)。
~0000 0000 0000 0000 0000 0000 0000 10001111 1111 1111 1111 1111 1111 1111 0111
然后在位于
0000 0000 0011 0000 1000 0000 0001 1000
1111 1111 1111 1111 1111 1111 1111 0111
根据结果:
0000 0000 0011 0000 1000 0000 0001 0000
到这里困扰我的&,|算是大概明白了什么场合下好用。