Bitwise Operators¶
Bitwise AND¶
Important
The two operands are converted to int
before the
operation is performed.
You can bitwise AND each signal sample with the corresponding element in
another Trace
or Iterable
, or an int
or float
number with the &
operator or by calling the method
bitwise_and()
.
A new Trace
instance labeled with the performed transformation
'and'
or 'rand'
is returned.
>>> # bitwise AND the samples with a trace
>>> Trace('Signal1', [-1, 0, 1]) & Trace('Signal2', [0xff, 0xff, 0xff])
Trace(label='Signal1:and', samples=[255, 0, 1])
>>> Trace('Signal1', [-1, 0, 1]).bitwise_and(Trace('Signal2', [0xff, 0xff, 0xff]))
Trace(label='Signal1:and', samples=[255, 0, 1])
>>> # bitwise AND the samples with an iterable
>>> Trace('Signal', [-1, 0, 1]) & [0xff, 0xff, 0xff]
Trace(label='Signal:and', samples=[255, 0, 1])
>>> Trace('Signal', [-1, 0, 1]).bitwise_and([0xff, 0xff, 0xff])
Trace(label='Signal:and', samples=[255, 0, 1])
>>> # bitwise AND an iterable with the samples
>>> [0xff, 0xff, 0xff] & Trace('Signal', [-1, 0, 1])
Trace(label='Signal:rand', samples=[255, 0, 1])
>>> # bitwise AND the samples with a number
>>> Trace('Signal', [-1, 0, 1]) & 0xff
Trace(label='Signal:and', samples=[255, 0, 1])
>>> Trace('Signal', [-1, 0, 1]).bitwise_and(0xff)
Trace(label='Signal:and', samples=[255, 0, 1])
>>> # bitwise AND a number with the samples
>>> 0xff & Trace('Signal', [-1, 0, 1])
Trace(label='Signal:rand', samples=[255, 0, 1])
Note
An iterable should have at least the same length as the signal
samples
, otherwise only a subset of the signal
samples
is returned!
(Source code, html)
Bitwise OR¶
Important
The two operands are converted to int
before the
operation is performed.
You can bitwise OR each signal sample with the corresponding element in
another Trace
or Iterable
, or an int
or float
number with the |
operator or by calling the method
bitwise_or()
.
A new Trace
instance labeled with the performed transformation
'or'
or 'ror'
is returned.
>>> # bitwise OR the samples with a trace
>>> Trace('Signal1', [-1, 0, 1]) | Trace('Signal2', [0x0, 0xff, 0xfe])
Trace(label='Signal1:or', samples=[-1, 255, 255])
>>> Trace('Signal1', [-1, 0, 1]).bitwise_or(Trace('Signal2', [0x0, 0xff, 0xfe]))
Trace(label='Signal1:or', samples=[-1, 255, 255])
>>> # bitwise OR the samples with an iterable
>>> Trace('Signal', [-1, 0, 1]) | [0x0, 0xff, 0xfe]
Trace(label='Signal:or', samples=[-1, 255, 255])
>>> Trace('Signal', [-1, 0, 1]).bitwise_or([0x0, 0xff, 0xfe])
Trace(label='Signal:or', samples=[-1, 255, 255])
>>> # bitwise OR an iterable with the samples
>>> [0x0, 0xff, 0xfe] | Trace('Signal', [-1, 0, 1])
Trace(label='Signal:ror', samples=[-1, 255, 255])
>>> # bitwise OR the samples with a number
>>> Trace('Signal', [-1, 0, 1]) | 0xfe
Trace(label='Signal:or', samples=[-1, 254, 255])
>>> Trace('Signal', [-1, 0, 1]).bitwise_or(0xfe)
Trace(label='Signal:or', samples=[-1, 254, 255])
>>> # bitwise OR a number with the samples
>>> 0xfe | Trace('Signal', [-1, 0, 1])
Trace(label='Signal:ror', samples=[-1, 254, 255])
Note
An iterable should have at least the same length as the signal
samples
, otherwise only a subset of the signal
samples
is returned!
(Source code, html)
Bitwise XOR¶
Important
The two operands are converted to int
before the
operation is performed.
You can bitwise XOR each signal sample with the corresponding element in
another Trace
or Iterable
, or an int
or float
number with the ^
operator or by calling the method
bitwise_xor()
.
A new Trace
instance labeled with the performed transformation
'xor'
or 'rxor'
is returned.
>>> # bitwise XOR the samples with a trace
>>> Trace('Signal1', [-1, 0, 1]) ^ Trace('Signal2', [0xfe, 0x1, 0x1])
Trace(label='Signal1:xor', samples=[-255, 1, 0])
>>> Trace('Signal1', [-1, 0, 1]).bitwise_xor(Trace('Signal2', [0xfe, 0x1, 0x1]))
Trace(label='Signal1:xor', samples=[-255, 1, 0])
>>> # bitwise XOR the samples with an iterable
>>> Trace('Signal', [-1, 0, 1]) ^ [0xfe, 0x1, 0x1]
Trace(label='Signal:xor', samples=[-255, 1, 0])
>>> Trace('Signal', [-1, 0, 1]).bitwise_xor([0xfe, 0x1, 0x1])
Trace(label='Signal:xor', samples=[-255, 1, 0])
>>> # bitwise XOR an iterable with the samples
>>> [0xfe, 0x1, 0x1] ^ Trace('Signal', [-1, 0, 1])
Trace(label='Signal:rxor', samples=[-255, 1, 0])
>>> # bitwise XOR the samples with a number
>>> Trace('Signal', [-1, 0, 1]) ^ 0xfe
Trace(label='Signal:xor', samples=[-255, 254, 255])
>>> Trace('Signal', [-1, 0, 1]).bitwise_xor(0xfe)
Trace(label='Signal:xor', samples=[-255, 254, 255])
>>> # bitwise XOR a number with the samples
>>> 0xfe ^ Trace('Signal', [-1, 0, 1])
Trace(label='Signal:rxor', samples=[-255, 254, 255])
Note
An iterable should have at least the same length as the signal
samples
, otherwise only a subset of the signal
samples
is returned!
(Source code, html)
Bitwise NOT¶
Important
The each signal sample is converted to int
before the
operation is performed.
You can bitwise invert each signal sample with the '~'
operator or by
calling the method invert()
.
A new Trace
instance labeled with the performed transformation
not
is returned.
>>> # bitwise NOT of the samples
>>> ~Trace('Signal', [-1, -128, 0, 1, 127])
Trace(label='Signal:not', samples=[0, 127, -1, -2, -128])
>>> Trace('Signal', [-1, -128, 0, 1, 127]).invert()
Trace(label='Signal:not', samples=[0, 127, -1, -2, -128])
(Source code, html)
Bitwise Left-Shift¶
Important
The two operands are converted to int
before the
operation is performed.
You can bitwise shift left each signal sample with the corresponding element
in another Trace
or Iterable
, or an int
or float
number by pushing zeros in from the right and let the leftmost bits fall off
with the <<
operator or by calling the method left_shift()
.
A new Trace
instance labeled with the performed transformation
'shl'
or 'rshl'
is returned.
>>> # left shift the samples by a trace
>>> Trace('Signal1', [-1, -128, 0, 1, 127]) << Trace('Signal2', [1, 1, 1, 0, 1])
Trace(label='Signal1:shl', samples=[-2, -256, 0, 1, 254])
>>> Trace('Signal1', [-1, -128, 0, 1, 127]).left_shift(Trace('Signal2', [1, 1, 1, 0, 1]))
Trace(label='Signal1:shl', samples=[-2, -256, 0, 1, 254])
>>> # left shift the samples by an iterable
>>> Trace('Signal', [-1, -128, 0, 1, 127]) << [1, 1, 1, 0, 1]
Trace(label='Signal:shl', samples=[-2, -256, 0, 1, 254])
>>> Trace('Signal', [-1, -128, 0, 1, 127]).left_shift([1, 1, 1, 0, 1])
Trace(label='Signal:shl', samples=[-2, -256, 0, 1, 254])
>>> # left shift the samples by a number
>>> Trace('Signal', [-1, -128, 0, 1, 127]) << 1
Trace(label='Signal:shl', samples=[-2, -256, 0, 2, 254])
>>> Trace('Signal', [-1, -128, 0, 1, 127]).left_shift(1)
Trace(label='Signal:shl', samples=[-2, -256, 0, 2, 254])
Note
An iterable should have at least the same length as the signal
samples
, otherwise only a subset of the signal
samples
is returned!
(Source code, html)
Bitwise Right-Shift¶
Important
The two operands are converted to int
before the
operation is performed.
You can bitwise shift right each signal sample with the corresponding element
in another Trace
or Iterable
, or an int
or float
number by pushing copies of the leftmost bit in from the left, and let the
rightmost bits fall off with the >>
operator or by calling the method
right_shift()
.
A new Trace
instance labeled with the performed transformation
'shr'
or 'rshr'
is returned.
>>> # right shift the samples by a trace
>>> Trace('Signal1', [-1, -128, 0, 1, 127]) >> Trace('Signal2', [1, 1, 1, 0, 1])
Trace(label='Signal1:shr', samples=[-1, -64, 0, 1, 63])
>>> Trace('Signal1', [-1, -128, 0, 1, 127]).right_shift(Trace('Signal2', [1, 1, 1, 0, 1]))
Trace(label='Signal1:shr', samples=[-1, -64, 0, 1, 63])
>>> # right shift the samples by an iterable
>>> Trace('Signal', [-1, -128, 0, 1, 127]) >> [1, 1, 1, 0, 1]
Trace(label='Signal:shr', samples=[-1, -64, 0, 1, 63])
>>> Trace('Signal', [-1, -128, 0, 1, 127]).right_shift([1, 1, 1, 0, 1])
Trace(label='Signal:shr', samples=[-1, -64, 0, 1, 63])
>>> # right shift the samples by a number
>>> Trace('Signal', [-1, -128, 0, 1, 127]) >> 1
Trace(label='Signal:shr', samples=[-1, -64, 0, 0, 63])
>>> Trace('Signal', [-1, -128, 0, 1, 127]).right_shift(1)
Trace(label='Signal:shr', samples=[-1, -64, 0, 0, 63])
Note
An iterable should have at least the same length as the signal
samples
, otherwise only a subset of the signal
samples
is returned!
(Source code, html)
Bitwise Unpacking¶
Important
The operand is converted to int
before the operation is
performed.
You can unpack a subset of consecutive bits from each signal sample by calling
the method bits()
.
A new Trace
instance labeled with the performed transformation
'bits'
is returned.
>>> # unpacking of the least significant bit in the samples
>>> Trace('Signal', [-1, -128, 0, 1, 127]).bits(0)
Trace(label='Signal:bits', samples=[1, 0, 0, 1, 1])
>>> # unpacking of the most significant bit in the samples
>>> Trace('Signal', [-1, -128, 0, 1, 127]).bits(31)
Trace(label='Signal:bits', samples=[1, 1, 0, 0, 0])
>>> # unpacking of a subset of consecutive bits in the samples
>>> Trace('Signal', [-1, -128, 0, 1, 127]).bits(index=1, number=4)
Trace(label='Signal:bits', samples=[15, 0, 0, 0, 15])
>>> Trace('Signal', [-1, -128, 0, 1, 127]).bits(1, 4)
Trace(label='Signal:bits', samples=[15, 0, 0, 0, 15])
(Source code, html)