Аннотированное решение:
$firstNrBin = '1 0 0 0 1 1 0 1'
$secondNrBin = '1 0 1 0 1 0 0 0'
# Convert the binary number strings to [byte]s (unsigned 8-bit values).
$firstNr = [Convert]::ToByte($firstNrBin -replace ' ', 2) # 141 == 0x8d
$secondNr = [Convert]::ToByte($secondNrBin -replace ' ', 2) # 168 == 0xa8
# Perform bitwise XOR logic and negate the result to get a bit field
# that reflects the bits where the input numbers match.
# Note the need use of -band 0xff to limit the result to 8 bits - see
# explanation below.
# -> 218 == 0xda = 11011010
$bitsInCommon = [byte] (-bnot ($firstNr -bxor $secondNr) -band 0xff)
# Convert the bit field back into a binary representation, 0-padded to 8 chars.
# -> '11011010'
$bitsInComminBin = [Convert]::ToString($bitsInCommon, 2).PadLeft(8, '0')
# Produce the desired output format with string manipulation
$result = ([char[]] $bitsInComminBin -replace '1', 'r' -replace '0', 'f') -join ' '
# Output the result
[ordered] @{
'first Nr' = $firstNrBin
'second Nr' = $secondNrBin
'Result' = $result
}
Выше приведено:
Name Value
---- -----
first Nr 1 0 0 0 1 1 0 1
second Nr 1 0 1 0 1 0 0 0
Result r r f r r f r f
Обратите внимание, что побитовые операторы PowerShell выводят [int]
- System.Int32
в качественаименьший тип данных, т. е. число со знаком .
Поэтому вам необходимо явно маскировать дополнительные биты с помощью оператора -band
, потому что непосредственное приведение обратно к unsigned тип не работает.
В данном случае:
$firstNr -bxor $secondNr # 141 -bxor 168
создает 37
как значение [int]
, то есть следующие 32 бита:
00000000000000000000000000100101
Применение -bnot
к этому [int]
дает побитовое дополнение:
11111111111111111111111111011010
Как [int]
, это отрицательное число, потому чтоустановлен старший бит: -38
Вы не можете привести его непосредственно к типу без знака, например [byte]
, чтобы получить только младшие 8 бит, но вы можете использовать -band
с битовой маской 0xff
обнулить все биты, кроме первых 8, - но учтите, что в этом случае результат все равно равен [int]
:
-bnot -38 -band 0xff
дает следующеебиты:
00000000000000000000000000100101
Как [int]
, это 37
, который вы можете безопасно вернуть обратно к [byte]
.