巧用位运算作为标识位

还在用int 或者 string 等作为状态的标示吗? Low.
用位运算记录状态就显得高级多了(主要是可以装逼…), 用栗子说话

1
2
3
4
5
6
7
public static final int SCROLL_FLAG_SCROLL = 0x1;
public static final int SCROLL_FLAG_EXIT_UNTIL_COLLAPSED = 0x2;
public static final int SCROLL_FLAG_ENTER_ALWAYS = 0x4;
public static final int SCROLL_FLAG_ENTER_ALWAYS_COLLAPSED = 0x8;
public static final int SCROLL_FLAG_SNAP = 0x10;

static final int FLAG_QUICK_RETURN = SCROLL_FLAG_SCROLL | SCROLL_FLAG_ENTER_ALWAYS;

上面代码有5种基础状态, 2种混合状态,都是用int来记录,
5个基本状态分别是0x1, 0x2, 0x4, 0x8, 0x10, 它们都是16进制数,这几个整数可不是随便定义的,是2的n方

它们的十进制和二进制分别是:

十进制:1, 2, 4, 8, 16
二进制:00001,00010,00100,01000,10000

仔细看二进制数,你会发现仅仅只有一个位置的值为1.

那有什么卵用呢,呵呵。

    1. 当验证某种状态是5种状态的一种时:

      定义一个flag来记录当前状态, 如果你想知道当前状态是不是SCROLL_FLAG_SCROLL, 只要用flag和SCROLL_FLAG_SCROLL进行与运算就可以了, 也就是当 flag & SCROLL_FLAG_SCROLL != 0时, 当前状态才是SCROLL_FLAG_SCROLL状态。 因为这5个状态的1在不同的位置,不同状态的值与运算后肯定等于0.

    1. 当验证某种状态是其种几种状态中之一时:

      定义一个flag来记录当前状态,如果你想知道当前状态是不是SCROLL_FLAG_SCROLL或者SCROLL_FLAG_ENTER_ALWAYS状态,
      先定义一个变量 FLAG_QUICK_RETURN = SCROLL_FLAG_SCROLL | SCROLL_FLAG_ENTER_ALWAYS。 当 flag & FLAG_QUICK_RETURN != 0时,那么当前状态就时SCROLL_FLAG_SCROLL或者SCROLL_FLAG_ENTER_ALWAYS。

Loading comments box needs to over the wall