2014-01-24 152 views
0

問題是基於此site從圖像獲取/設置位值

有人能解釋這些臺詞的意思:

private int getBitValue(int n, int location) { 
     int v = n & (int) Math.round(Math.pow(2, location)); 
     return v==0?0:1; 
} 

private int setBitValue(int n, int location, int bit) { 
    int toggle = (int) Math.pow(2, location), bv = getBitValue(n, location); 
    if(bv == bit) 
     return n; 
    if(bv == 0 && bit == 1) 
     n |= toggle; 
    else if(bv == 1 && bit == 0) 
     n ^= toggle; 
    return n; 
} 

回答

2
int v = n & (int) Math.round(Math.pow(2, location)); 

Math.pow(2, location)提高2給定的功率。這是舍入並轉換爲整數。在二進制中,如果location==0爲00000001,如果爲location==1,則爲00000010,如果是location==2,則爲00000100等等(更好的是1 << location,其將「1」移位一定數量的比特,在右邊填充0比特使用Math.pow將可能試圖在每次調用時計算2的對數)。

n & ...是一個按位與。由於右側的項目只設置了一個位,所以效果是將n中的每個位除外,然後將結果放在v中。這意味着v將爲0,如果是一位在n爲0,0以外的東西,如果該位是',這意味着

return v==0?0:1; 

返回0,如果該位是明確的,1,如果它的設置。

int toggle = (int) Math.pow(2, location), bv = getBitValue(n, location); 

toggle設爲我已經描述了Math.pow事情。 bv被設置爲一個已經在n位,這是0或1。如果這等於你將其設置爲的事情,那麼我們就不需要做任何事情來n

if(bv == bit) 
    return n; 

否則,要麼我們需要將它設置爲1(請記住,toggle將只設置一個位)。 n |= togglen = n | toggle相同。 |是逐位OR,這樣一位將在n設置和n其他位將保持不變」

if(bv == 0 && bit == 1) 
    n |= toggle; 

或者我們需要將位設置爲0。n ^= toggle是一樣的如果我們到這裏,那麼n中的位是1,並且toggle中的位是1,並且我們想要將n中的位設置爲0,因此異或會將該位更改爲0同時留下所有其他位:

else if(bv == 1 && bit == 0) 
    n ^= toggle; 
+0

這是一個非常明確的解釋。我需要回頭再看代碼,並試着理解它。謝謝你們。 –

+0

爲什麼在'setBitValue(int n,int location,int bit)'方法中需要再次執行'getBitValue',而這次是使用rgb值但是消息長度。 –

+1

@JarekHuang這就是他們實現它的方式。要設置位值,該算法獲取當前位值,然後查看三種不同情況:(1)當前位值=期望值,不做任何事情; (2)當前值爲0,期望= 1; (3)當前值爲1,期望值= 0。有一些方法可以在不使用'getBitValue'的情況下完成此操作:'result =(n&〜toggle)| ((位== 1)?toggle:0)',例如。 – ajb

1

的getBitValue只是得到一個指定位的值(在某一位置)

的setBitValue在匹配的特定位置上設置一個位的值。

這些getter/setter方法通常用於圖像處理,即如果你有麝香,並且你想改變一個特定的位值。

沒有更多或更少。

+0

對不起,沒有說清楚。我想知道這兩個方法中每行的含義,以及爲什麼'setBitValue(int n,int location,int bit)'需要再次執行'getBitValue(n,location);'。 –