2014-01-24 156 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);'。 –