Pharo如何做位掩码操作?

How to do a bit mask operation Pharo?

在 Pharo 中,我想对整数进行位掩码,在 Python 中看起来像这样:

((b1 & 0x3F) << 4) | (b2 >> 4)

我知道 &| 在 Pharo 中工作,但我很确定它们不是按位的。

从这个gist:

"************************************************************************
 * Bitwise Manipulation:                                                *
 ************************************************************************"
| b x |
x := 2r1111 bitAnd: 2r0100.                                 "and bits"
x := 4r3333 bitAnd: 2r011011011.                            "and with different bases"
x := 2r1111 bitOr: 2r0100.                                  "or bits"
x := 16rFF bitXor: 8r5252.                                  "xor bits mixing bases"
x := 16rFF bitInvert.                                       "invert bits"
x := 2r0100 bitShift: 2.                                    "left shift"
x := 2r0100 bitShift: -2.                                   "right shift"
x := 2r0100 >> 2.                                           "divide by four"
x := 2r0100 << 2.                                           "multiply by four"
x := 2r0100 bitAt: 3.                                       "bit at position (0|1)"
x := 2r0100 highBit.                                        "position of highest bit set"
b := 16rFF allMask: 16r0F.                                  "test if all bits set in mask set in receiver"
b := 16rFF anyMask: 16r0F.                                  "test if any bits set in mask set in receiver"
b := 16rFF noMask: 16r0F.                                   "test if all bits set in mask clear in receiver"```

所以,您可以将 ((b1 & 0x3F) << 4) | (b2 >> 4) 写成

((b1 bitAnd: 16r3F) << 4) bitOr: (b2 >> 4)

但你错了:)

查看 &|<<>> 在 Pharo 中的实现:

& aNumber
    ^ self bitAnd: aNumber

| anInteger
    ^self bitOr: anInteger

<< shiftAmount
    "left shift"

    shiftAmount < 0 ifTrue: [self error: 'negative arg'].
    ^ self bitShift: shiftAmount

>> shiftAmount
    "right shift"

    shiftAmount < 0 ifTrue: [self error: 'negative arg'].
    ^ self bitShift: 0 - shiftAmount

这基本上意味着除了将十六进制 C 样式转换为十六进制 Pharo 样式之外,您的代码将开箱即用:

((b1 & 16r3F) << 4) | (b2 >> 4)

如果您经常需要这样做,您可能不想将其应用于整数。它们有一种特殊的编码,不允许您使用所有 64 位。看看Collections-Native