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
在 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