2010-04-30 72 views
4

位掩碼參數,我發現了很多的Android功能都可以通過在這是一個位掩碼,爲不同的選擇,像的PendingIntent,你可以在東西傳給你一樣可以調用getActivity(參數)與PendingIntent.FLAG_CANCEL_CURRENT|PendingIntent.FLAG_NO_CREATE創造一個函數或方法

我不知道我怎樣才能創建具有這樣參數的函數?

回答

10
public static final int FLAG_1 = 1<<0; // 0x01 
public static final int FLAG_2 = 1<<1; // 0x02 
public static final int FLAG_3 = 1<<2; // 0x04 
public static final int FLAG_4 = 1<<3; // 0x08 

public void myFlagsFunction(int flags) { 
    if (0 != (flags & FLAG_1)) { 
    // do stuff 
    } 
    if (0 != (flags & FLAG_2)) { 
    // do stuff 
    } 
} 
1

它們是通過手動完成的,只需定義兩個冪的標誌。 This file使用左位移運算符,但不是必需的:

public static final int FLAG_ONE_SHOT = 1<<30; 
//... 
public static final int FLAG_NO_CREATE = 1<<29; 
0

當我們做單< <(左移)爲int值,int值的二進制表示得到一個0從左邊最左邊的位被丟棄,這就產生了int的原始值加倍的效果,這意味着在每一次左移之後,我們將得到原始值的兩倍,這直到第31個索引(起始從右邊的0開始索引)最左邊的值被設置爲1,因爲使用了< <,在這種情況下,而不是原來的值的兩倍mes消極的int值。

現在所有的2的正面力量是1,2,4,8,16,32,......,1073741824對於int值。 這些值在某些索引處的二進制表示中僅包含單個'1'。

這有一個利潤,當你| (按位或)2的這些冪中的任何兩個,對於這兩個值,對應的索引「1」在結果值中被設置爲「1」。

例如8(1000)具有1的索引3處,和圖2(10)具有1的索引1,在當我們| (或)他們我們得到1010二進制,這意味着1和3索引位都設置爲1.

所以,如果你想檢查哪些標誌組合,你只需要檢查'1的。

對於示例 -

static int test0= 1; 
static int test1= 2; 
static int test2= 4; 
static int test3= 8; 
static int test4= 16; 
static int test5= 32; 
static int test6= 64; 
int[] result; 
int[] decision(int flags){ 
    char[] x=Integer.toBinaryString(flags).toCharArray(); 
    result=new int[x.length]; 
    for(int i=x.length-1,j=0,k=0;i>=0;i--) 
     switch (x[k++]){ 
      case '0': 
      break; 
      case '1': 
      if(i==0){ 
       result[j++]=-1; //for ...000001 (test0) put -1 into the array instead of the value of i which is 0. 
       break; 
      } 
      result[j++]=i; 
      }; 
     return result; 
    } 

/* 例如,如果該判定方法返回其包含{6,3,1,0,0,0},那麼這意味着TEST6,TEST3和TEST1一個陣列標誌是or-ed(決定(test6 | test3 | test1))。 */

感謝上面的兩個答案,我問你如何提到的方法工作,我從上面的兩個答案得到了答案。實際的實現工作如前面兩個答案中所示。

相關問題