在使用js代码的端口时,我在使用按位操作时遇到了困难。
有一个if条件,我不确定我完全理解。
我无法理解的条件是
func (K *KBucket) determineNode(node *KBucketNode, id []byte, bitIndex int) *KBucketNode {
if len(id) < 20 {
panic(fmt.Errorf("id length must be 20, got %v", id))
}
// **NOTE** remember that id is a Buffer and has granularity of
// bytes (8 bits), whereas the bitIndex is the _bit_ index (not byte)
// id's that are too short are put in low bucket (1 byte = 8 bits)
// parseInt(bitIndex / 8) finds how many bytes the bitIndex describes
// bitIndex % 8 checks if we have extra bits beyond byte multiples
// if number of bytes is <= no. of bytes described by bitIndex and there
// are extra bits to consider, this means id has less bits than what
// bitIndex describes, id therefore is too short, and will be put in low
// bucket
bytesDescribedByBitIndex := int(math.Floor(float64(bitIndex) / 8))
bitIndexWithinByte := float64(bitIndex % 8)
if len(id) <= bytesDescribedByBitIndex && bitIndexWithinByte != 0 {
return node.left
}
byteUnderConsideration := id[bytesDescribedByBitIndex]
// byteUnderConsideration is an integer from 0 to 255 represented by 8 bits
// where 255 is 11111111 and 0 is 00000000
// in order to find out whether the bit at bitIndexWithinByte is set
// we construct Math.pow(2, (7 - bitIndexWithinByte)) which will consist
// of all bits being 0, with only one bit set to 1
// for example, if bitIndexWithinByte is 3, we will construct 00010000 by
// Math.pow(2, (7 - 3)) -> Math.pow(2, 4) -> 16
y := int(byteUnderConsideration) & int(math.Pow(2, (7-bitIndexWithinByte)))
if y > 0 {
return node.right
}
return node.left
}
我无法弄清楚在这种情况下什么时候会成真。
完整的原始代码是,
String languageToLoad = "en"; // your language
Locale locale = new Locale(languageToLoad);
Locale.setDefault(locale);
Configuration config = new Configuration();
config.locale = locale;
getBaseContext().getResources().updateConfiguration(config,
getBaseContext().getResources().getDisplayMetrics());
移植的代码是,
{{1}}
我通常不会执行这种计算,这一点都不清楚,我无法正确确定打印它们的正确方法,以便开始理解逻辑。
谢谢!
答案 0 :(得分:2)
首先,如果你正在处理比特而不是:
x * 8
x / 8
也许可以:
x << 3
x >> 3
这将使意图更加明确。
此外,使用它没有多大意义:
byteUnderConsideration & Math.pow(2, (7 - bitIndexWithinByte))
当你能做到:
byteUnderConsideration & (1 << (7 - bitIndexWithinByte))
哪个更清楚(甚至不提及它会更有效率)。
<<
运算符向左移位,>>
向右移位。
&
运算符对同一位置上的位进行AND运算,|
运算符对这些位进行OR运算。
你应该花些时间阅读一下JavaScript中的按位运算符(它与C中的运算方式几乎相同)因为你制作了许多奇怪的结构,如:
~~(x / 8)
可以只是:
x >> 3
并且不需要~~
(否定完成两次)因为你已经有了一个整数。此外,即使您需要强制转换为整数,也不要执行~~x
,您可能最好不要执行x|0
- 请参阅合并运算符~~
和{{之间的差异1}}这里: