Если $A
является 8-битным значением, и если вы хотите использовать И все 8 битов друг с другом, вы всегда получите 0
, если все 8 бит не равны 1
+----+----+----+----+----+----+----+----+---------------------------------------+
| A7 | A6 | A5 | A4 | A3 | A2 | A1 | A0 | A7 & A6 & A5 & A4 & A3 & A2 & A1 & A0 |
+----+----+----+----+----+----+----+----+---------------------------------------+
| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
+----+----+----+----+----+----+----+----+---------------------------------------+
| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 |
+----+----+----+----+----+----+----+----+---------------------------------------+
| 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 |
+----+----+----+----+----+----+----+----+---------------------------------------+
| 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 0 |
+----+----+----+----+----+----+----+----+---------------------------------------+
| 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 |
+----+----+----+----+----+----+----+----+---------------------------------------+
...
+----+----+----+----+----+----+----+----+---------------------------------------+
| 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 0 |
+----+----+----+----+----+----+----+----+---------------------------------------+
| 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
+----+----+----+----+----+----+----+----+---------------------------------------+
Это означает, что вы получите 0
, если $A
не равно 0b11111111
aka 0xFF
aka 255
. Это означает, что вы можете просто использовать следующее:
my $B = $A == 255 ? 1 : 0;
Вышеупомянутое решение намного проще и быстрее, чем использование побитовых операций, но их можно использовать.
Чтобы выделить немного, используется следующее:
( $A >> $bitnum ) & 1
Таким образом, следующее будет И 8 бит вместе:
my $B =
( ( $A >> 7 ) & 1 )
& ( ( $A >> 6 ) & 1 )
& ( ( $A >> 5 ) & 1 )
& ( ( $A >> 4 ) & 1 )
& ( ( $A >> 3 ) & 1 )
& ( ( $A >> 2 ) & 1 )
& ( ( $A >> 1 ) & 1 )
& ( ( $A >> 0 ) & 1 );
Удаление избыточного & 1
дает нам следующее упрощенное решение:
my $B = 1
& ( $A >> 7 )
& ( $A >> 6 )
& ( $A >> 5 )
& ( $A >> 4 )
& ( $A >> 3 )
& ( $A >> 2 )
& ( $A >> 1 )
& ( $A >> 0 );
Фактически, поскольку мы начинаем с 8-битного значения, достаточно следующего:
my $B =
( $A >> 7 )
& ( $A >> 6 )
& ( $A >> 5 )
& ( $A >> 4 )
& ( $A >> 3 )
& ( $A >> 2 )
& ( $A >> 1 )
& ( $A >> 0 );
Мы можем улучшить это, добавив несколько битов одновременно!
my $B = $A;
$B &= $B >> 4;
$B &= $B >> 2;
$B &= $B >> 1;