问题基于此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;
}
答案 0 :(得分:2)
int v = n & (int) Math.round(Math.pow(2, location));
Math.pow(2, location)
提升2给定的力量。这是舍入的并转换为整数。在二进制中,如果location==0
,则为00000001;如果为location==1
,则为000000100;如果为location==2
,则为00000100,等等(更好的是1 << location
将“1”移动到一定数量的位,在右边填充0位。使用Math.pow
可能会在每次调用时尝试计算2的对数。)
n & ...
是一个按位AND。由于右侧的项只有一位设置,因此效果是将n
中的每个位置零,除了那一位,并将结果放在v
中。这意味着如果v
中的一位为0,则n
将为0,如果该位为“,则{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.如果这等于你设置它的那个,那么我们不需要对{{1 }}:
n
否则,我们需要将其设置为1(请记住if(bv == bit)
return n;
只有一位设置)。 toggle
与n |= toggle
相同。 n = n | toggle
是一个按位OR,因此|
中将设置一位,n
中的所有其他位将保持不变“
n
或者我们需要将该位设置为0. if(bv == 0 && bit == 1)
n |= toggle;
与n ^= toggle
相同。 n = n ^ toggle
是一个异或。如果我们到达此处,则n
中的位为1,n
中的位为1,我们希望将toggle
中的位设置为0,因此异或将更改该位为0,同时使其他位保持不变:
n
答案 1 :(得分:1)
getBitValue只获取指定位的值(在某个位置)
setBitValue设置匹配的特定位置上的位值。
这些getter / setter方法通常用于图像处理,即如果你有麝香,并且想要更改特定的比特值。
没有更多或更少。