Hamming Distance comparison with powershell
How can i compare 8 bit with another 8 bit to have something like this:
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
r = right
f = false
Thanks
powershell
add a comment |
How can i compare 8 bit with another 8 bit to have something like this:
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
r = right
f = false
Thanks
powershell
2
$Result = -bNot $First -xor $Second
– iRon
Nov 19 '18 at 22:09
add a comment |
How can i compare 8 bit with another 8 bit to have something like this:
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
r = right
f = false
Thanks
powershell
How can i compare 8 bit with another 8 bit to have something like this:
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
r = right
f = false
Thanks
powershell
powershell
edited Nov 19 '18 at 22:02
Drew
1,170416
1,170416
asked Nov 19 '18 at 21:50
Khabat RammoKhabat Rammo
114
114
2
$Result = -bNot $First -xor $Second
– iRon
Nov 19 '18 at 22:09
add a comment |
2
$Result = -bNot $First -xor $Second
– iRon
Nov 19 '18 at 22:09
2
2
$Result = -bNot $First -xor $Second– iRon
Nov 19 '18 at 22:09
$Result = -bNot $First -xor $Second– iRon
Nov 19 '18 at 22:09
add a comment |
2 Answers
2
active
oldest
votes
An annotated solution:
$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
}
The above yields:
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
Note that PowerShell's bitwise operators output [int] - System.Int32 as the smallest data type, i.e., signed numbers.
Therefore you have to mask out extra bits explicitly with the -band operator, because directly casting back to an unsigned type doesn't work.
In the case at hand:
$firstNr -bxor $secondNr # 141 -bxor 168
produces 37 as an [int] value, i.e, the following 32 bits:
00000000000000000000000000100101
Applying -bnot to this [int] yields the bitwise complement:
11111111111111111111111111011010
As an [int], this is a negative number, because the high bit is set: -38
You cannot cast this directly back to an unsigned type such as [byte] to only get the lowest 8 bits, but you can use -band with bit mask 0xff to zero out all bits beyond the first 8 ones - but note that the result is still an [int] at that point:
-bnot -38 -band 0xff
yields the following bits:
00000000000000000000000000100101
As an [int], this is 37, which you can safely cast back to [byte].
add a comment |
You can use bitwise comparison operators:
e.g.
[byte]$a = 9 #00001001
[byte]$b = 12 #00001100
-bnot ($a -bxor $b) #11111010
$a -band $b #00001000
$a -bor $b #00001101
For your scenario you're looking at -bxor functionality, only taking the negative (-bnot) of the result.
If you need to see the flags themselves, you can use methods such as these:
function Format-BooleanString {
[CmdletBinding()]
Param (
[Parameter(Mandatory = $true, ValueFromPipeline = $true)]
[byte]$ByteToDisplay
)
Process {
[string]$result = ''
for ([int]$i = 7; $i -ge 0; $i--) {
[int]$x = [Math]::Pow(2, $i)
if ($ByteToDisplay -band $x) {
$result += '1'
} else {
$result += '0'
}
}
$result
}
}
function Convert-BooleanStringToByte {
[CmdletBinding()]
Param (
[Parameter(Mandatory = $true, ValueFromPipeline = $true)]
[string]$ByteAsString
)
Process {
if ($ByteAsString -notmatch '^[01]{8}$') {
throw 'Input string must be 8 chars, consisting of only 0s and/or 1s'
}
[int]$result = 0
for ([int]$i = 0; $i -lt 8; $i++) {
if ($ByteAsString[$i] -eq '1') {
$result += [Math]::Pow(2, 7-$i)
}
}
[byte]$result
}
}
Format-BooleanString -ByteToDisplay 9
Convert-BooleanStringToByte -ByteAsString '00100010'
1
Thanks a lot for answering my question. But is there any possibility to do the bits and not numbers. Regards
– Khabat Rammo
Nov 19 '18 at 22:27
Sure... Under the covers they're the same thing; i.e. a number's just a collection of bits. So it's only at display or input time that this makes a difference... I've added a couple of functions which allow you to convert from/to the display values (I've used 1s and 0s, but you could easily amend it to work withrs andfs.
– JohnLBevan
Nov 19 '18 at 22:38
1
PERFECT. Thanks a loot.
– Khabat Rammo
Nov 19 '18 at 22:43
1
Helpful, but note that-bnot ($a -bxor $b)doesn't yield11111010(250), it yields11111111111111111111111111111010(-6), because the smallest data type that PowerShell's binary operators return is[int], so you need to mask out the higher bits. No real need for custom functions, because .NET supports these conversions directly:$bin = [Convert]::ToString(9, 2)and[Convert]::ToByte($bin, 2)
– mklement0
Nov 20 '18 at 4:48
1
Thanks @mklement0, I wasn't aware of the second (base) parameter for those functions. Nice one.
– JohnLBevan
Nov 20 '18 at 7:09
add a comment |
Your Answer
StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53383139%2fhamming-distance-comparison-with-powershell%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
2 Answers
2
active
oldest
votes
2 Answers
2
active
oldest
votes
active
oldest
votes
active
oldest
votes
An annotated solution:
$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
}
The above yields:
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
Note that PowerShell's bitwise operators output [int] - System.Int32 as the smallest data type, i.e., signed numbers.
Therefore you have to mask out extra bits explicitly with the -band operator, because directly casting back to an unsigned type doesn't work.
In the case at hand:
$firstNr -bxor $secondNr # 141 -bxor 168
produces 37 as an [int] value, i.e, the following 32 bits:
00000000000000000000000000100101
Applying -bnot to this [int] yields the bitwise complement:
11111111111111111111111111011010
As an [int], this is a negative number, because the high bit is set: -38
You cannot cast this directly back to an unsigned type such as [byte] to only get the lowest 8 bits, but you can use -band with bit mask 0xff to zero out all bits beyond the first 8 ones - but note that the result is still an [int] at that point:
-bnot -38 -band 0xff
yields the following bits:
00000000000000000000000000100101
As an [int], this is 37, which you can safely cast back to [byte].
add a comment |
An annotated solution:
$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
}
The above yields:
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
Note that PowerShell's bitwise operators output [int] - System.Int32 as the smallest data type, i.e., signed numbers.
Therefore you have to mask out extra bits explicitly with the -band operator, because directly casting back to an unsigned type doesn't work.
In the case at hand:
$firstNr -bxor $secondNr # 141 -bxor 168
produces 37 as an [int] value, i.e, the following 32 bits:
00000000000000000000000000100101
Applying -bnot to this [int] yields the bitwise complement:
11111111111111111111111111011010
As an [int], this is a negative number, because the high bit is set: -38
You cannot cast this directly back to an unsigned type such as [byte] to only get the lowest 8 bits, but you can use -band with bit mask 0xff to zero out all bits beyond the first 8 ones - but note that the result is still an [int] at that point:
-bnot -38 -band 0xff
yields the following bits:
00000000000000000000000000100101
As an [int], this is 37, which you can safely cast back to [byte].
add a comment |
An annotated solution:
$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
}
The above yields:
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
Note that PowerShell's bitwise operators output [int] - System.Int32 as the smallest data type, i.e., signed numbers.
Therefore you have to mask out extra bits explicitly with the -band operator, because directly casting back to an unsigned type doesn't work.
In the case at hand:
$firstNr -bxor $secondNr # 141 -bxor 168
produces 37 as an [int] value, i.e, the following 32 bits:
00000000000000000000000000100101
Applying -bnot to this [int] yields the bitwise complement:
11111111111111111111111111011010
As an [int], this is a negative number, because the high bit is set: -38
You cannot cast this directly back to an unsigned type such as [byte] to only get the lowest 8 bits, but you can use -band with bit mask 0xff to zero out all bits beyond the first 8 ones - but note that the result is still an [int] at that point:
-bnot -38 -band 0xff
yields the following bits:
00000000000000000000000000100101
As an [int], this is 37, which you can safely cast back to [byte].
An annotated solution:
$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
}
The above yields:
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
Note that PowerShell's bitwise operators output [int] - System.Int32 as the smallest data type, i.e., signed numbers.
Therefore you have to mask out extra bits explicitly with the -band operator, because directly casting back to an unsigned type doesn't work.
In the case at hand:
$firstNr -bxor $secondNr # 141 -bxor 168
produces 37 as an [int] value, i.e, the following 32 bits:
00000000000000000000000000100101
Applying -bnot to this [int] yields the bitwise complement:
11111111111111111111111111011010
As an [int], this is a negative number, because the high bit is set: -38
You cannot cast this directly back to an unsigned type such as [byte] to only get the lowest 8 bits, but you can use -band with bit mask 0xff to zero out all bits beyond the first 8 ones - but note that the result is still an [int] at that point:
-bnot -38 -band 0xff
yields the following bits:
00000000000000000000000000100101
As an [int], this is 37, which you can safely cast back to [byte].
edited Nov 20 '18 at 4:56
answered Nov 20 '18 at 4:34
mklement0mklement0
127k20241269
127k20241269
add a comment |
add a comment |
You can use bitwise comparison operators:
e.g.
[byte]$a = 9 #00001001
[byte]$b = 12 #00001100
-bnot ($a -bxor $b) #11111010
$a -band $b #00001000
$a -bor $b #00001101
For your scenario you're looking at -bxor functionality, only taking the negative (-bnot) of the result.
If you need to see the flags themselves, you can use methods such as these:
function Format-BooleanString {
[CmdletBinding()]
Param (
[Parameter(Mandatory = $true, ValueFromPipeline = $true)]
[byte]$ByteToDisplay
)
Process {
[string]$result = ''
for ([int]$i = 7; $i -ge 0; $i--) {
[int]$x = [Math]::Pow(2, $i)
if ($ByteToDisplay -band $x) {
$result += '1'
} else {
$result += '0'
}
}
$result
}
}
function Convert-BooleanStringToByte {
[CmdletBinding()]
Param (
[Parameter(Mandatory = $true, ValueFromPipeline = $true)]
[string]$ByteAsString
)
Process {
if ($ByteAsString -notmatch '^[01]{8}$') {
throw 'Input string must be 8 chars, consisting of only 0s and/or 1s'
}
[int]$result = 0
for ([int]$i = 0; $i -lt 8; $i++) {
if ($ByteAsString[$i] -eq '1') {
$result += [Math]::Pow(2, 7-$i)
}
}
[byte]$result
}
}
Format-BooleanString -ByteToDisplay 9
Convert-BooleanStringToByte -ByteAsString '00100010'
1
Thanks a lot for answering my question. But is there any possibility to do the bits and not numbers. Regards
– Khabat Rammo
Nov 19 '18 at 22:27
Sure... Under the covers they're the same thing; i.e. a number's just a collection of bits. So it's only at display or input time that this makes a difference... I've added a couple of functions which allow you to convert from/to the display values (I've used 1s and 0s, but you could easily amend it to work withrs andfs.
– JohnLBevan
Nov 19 '18 at 22:38
1
PERFECT. Thanks a loot.
– Khabat Rammo
Nov 19 '18 at 22:43
1
Helpful, but note that-bnot ($a -bxor $b)doesn't yield11111010(250), it yields11111111111111111111111111111010(-6), because the smallest data type that PowerShell's binary operators return is[int], so you need to mask out the higher bits. No real need for custom functions, because .NET supports these conversions directly:$bin = [Convert]::ToString(9, 2)and[Convert]::ToByte($bin, 2)
– mklement0
Nov 20 '18 at 4:48
1
Thanks @mklement0, I wasn't aware of the second (base) parameter for those functions. Nice one.
– JohnLBevan
Nov 20 '18 at 7:09
add a comment |
You can use bitwise comparison operators:
e.g.
[byte]$a = 9 #00001001
[byte]$b = 12 #00001100
-bnot ($a -bxor $b) #11111010
$a -band $b #00001000
$a -bor $b #00001101
For your scenario you're looking at -bxor functionality, only taking the negative (-bnot) of the result.
If you need to see the flags themselves, you can use methods such as these:
function Format-BooleanString {
[CmdletBinding()]
Param (
[Parameter(Mandatory = $true, ValueFromPipeline = $true)]
[byte]$ByteToDisplay
)
Process {
[string]$result = ''
for ([int]$i = 7; $i -ge 0; $i--) {
[int]$x = [Math]::Pow(2, $i)
if ($ByteToDisplay -band $x) {
$result += '1'
} else {
$result += '0'
}
}
$result
}
}
function Convert-BooleanStringToByte {
[CmdletBinding()]
Param (
[Parameter(Mandatory = $true, ValueFromPipeline = $true)]
[string]$ByteAsString
)
Process {
if ($ByteAsString -notmatch '^[01]{8}$') {
throw 'Input string must be 8 chars, consisting of only 0s and/or 1s'
}
[int]$result = 0
for ([int]$i = 0; $i -lt 8; $i++) {
if ($ByteAsString[$i] -eq '1') {
$result += [Math]::Pow(2, 7-$i)
}
}
[byte]$result
}
}
Format-BooleanString -ByteToDisplay 9
Convert-BooleanStringToByte -ByteAsString '00100010'
1
Thanks a lot for answering my question. But is there any possibility to do the bits and not numbers. Regards
– Khabat Rammo
Nov 19 '18 at 22:27
Sure... Under the covers they're the same thing; i.e. a number's just a collection of bits. So it's only at display or input time that this makes a difference... I've added a couple of functions which allow you to convert from/to the display values (I've used 1s and 0s, but you could easily amend it to work withrs andfs.
– JohnLBevan
Nov 19 '18 at 22:38
1
PERFECT. Thanks a loot.
– Khabat Rammo
Nov 19 '18 at 22:43
1
Helpful, but note that-bnot ($a -bxor $b)doesn't yield11111010(250), it yields11111111111111111111111111111010(-6), because the smallest data type that PowerShell's binary operators return is[int], so you need to mask out the higher bits. No real need for custom functions, because .NET supports these conversions directly:$bin = [Convert]::ToString(9, 2)and[Convert]::ToByte($bin, 2)
– mklement0
Nov 20 '18 at 4:48
1
Thanks @mklement0, I wasn't aware of the second (base) parameter for those functions. Nice one.
– JohnLBevan
Nov 20 '18 at 7:09
add a comment |
You can use bitwise comparison operators:
e.g.
[byte]$a = 9 #00001001
[byte]$b = 12 #00001100
-bnot ($a -bxor $b) #11111010
$a -band $b #00001000
$a -bor $b #00001101
For your scenario you're looking at -bxor functionality, only taking the negative (-bnot) of the result.
If you need to see the flags themselves, you can use methods such as these:
function Format-BooleanString {
[CmdletBinding()]
Param (
[Parameter(Mandatory = $true, ValueFromPipeline = $true)]
[byte]$ByteToDisplay
)
Process {
[string]$result = ''
for ([int]$i = 7; $i -ge 0; $i--) {
[int]$x = [Math]::Pow(2, $i)
if ($ByteToDisplay -band $x) {
$result += '1'
} else {
$result += '0'
}
}
$result
}
}
function Convert-BooleanStringToByte {
[CmdletBinding()]
Param (
[Parameter(Mandatory = $true, ValueFromPipeline = $true)]
[string]$ByteAsString
)
Process {
if ($ByteAsString -notmatch '^[01]{8}$') {
throw 'Input string must be 8 chars, consisting of only 0s and/or 1s'
}
[int]$result = 0
for ([int]$i = 0; $i -lt 8; $i++) {
if ($ByteAsString[$i] -eq '1') {
$result += [Math]::Pow(2, 7-$i)
}
}
[byte]$result
}
}
Format-BooleanString -ByteToDisplay 9
Convert-BooleanStringToByte -ByteAsString '00100010'
You can use bitwise comparison operators:
e.g.
[byte]$a = 9 #00001001
[byte]$b = 12 #00001100
-bnot ($a -bxor $b) #11111010
$a -band $b #00001000
$a -bor $b #00001101
For your scenario you're looking at -bxor functionality, only taking the negative (-bnot) of the result.
If you need to see the flags themselves, you can use methods such as these:
function Format-BooleanString {
[CmdletBinding()]
Param (
[Parameter(Mandatory = $true, ValueFromPipeline = $true)]
[byte]$ByteToDisplay
)
Process {
[string]$result = ''
for ([int]$i = 7; $i -ge 0; $i--) {
[int]$x = [Math]::Pow(2, $i)
if ($ByteToDisplay -band $x) {
$result += '1'
} else {
$result += '0'
}
}
$result
}
}
function Convert-BooleanStringToByte {
[CmdletBinding()]
Param (
[Parameter(Mandatory = $true, ValueFromPipeline = $true)]
[string]$ByteAsString
)
Process {
if ($ByteAsString -notmatch '^[01]{8}$') {
throw 'Input string must be 8 chars, consisting of only 0s and/or 1s'
}
[int]$result = 0
for ([int]$i = 0; $i -lt 8; $i++) {
if ($ByteAsString[$i] -eq '1') {
$result += [Math]::Pow(2, 7-$i)
}
}
[byte]$result
}
}
Format-BooleanString -ByteToDisplay 9
Convert-BooleanStringToByte -ByteAsString '00100010'
edited Nov 19 '18 at 22:43
answered Nov 19 '18 at 22:09
JohnLBevanJohnLBevan
14.3k145105
14.3k145105
1
Thanks a lot for answering my question. But is there any possibility to do the bits and not numbers. Regards
– Khabat Rammo
Nov 19 '18 at 22:27
Sure... Under the covers they're the same thing; i.e. a number's just a collection of bits. So it's only at display or input time that this makes a difference... I've added a couple of functions which allow you to convert from/to the display values (I've used 1s and 0s, but you could easily amend it to work withrs andfs.
– JohnLBevan
Nov 19 '18 at 22:38
1
PERFECT. Thanks a loot.
– Khabat Rammo
Nov 19 '18 at 22:43
1
Helpful, but note that-bnot ($a -bxor $b)doesn't yield11111010(250), it yields11111111111111111111111111111010(-6), because the smallest data type that PowerShell's binary operators return is[int], so you need to mask out the higher bits. No real need for custom functions, because .NET supports these conversions directly:$bin = [Convert]::ToString(9, 2)and[Convert]::ToByte($bin, 2)
– mklement0
Nov 20 '18 at 4:48
1
Thanks @mklement0, I wasn't aware of the second (base) parameter for those functions. Nice one.
– JohnLBevan
Nov 20 '18 at 7:09
add a comment |
1
Thanks a lot for answering my question. But is there any possibility to do the bits and not numbers. Regards
– Khabat Rammo
Nov 19 '18 at 22:27
Sure... Under the covers they're the same thing; i.e. a number's just a collection of bits. So it's only at display or input time that this makes a difference... I've added a couple of functions which allow you to convert from/to the display values (I've used 1s and 0s, but you could easily amend it to work withrs andfs.
– JohnLBevan
Nov 19 '18 at 22:38
1
PERFECT. Thanks a loot.
– Khabat Rammo
Nov 19 '18 at 22:43
1
Helpful, but note that-bnot ($a -bxor $b)doesn't yield11111010(250), it yields11111111111111111111111111111010(-6), because the smallest data type that PowerShell's binary operators return is[int], so you need to mask out the higher bits. No real need for custom functions, because .NET supports these conversions directly:$bin = [Convert]::ToString(9, 2)and[Convert]::ToByte($bin, 2)
– mklement0
Nov 20 '18 at 4:48
1
Thanks @mklement0, I wasn't aware of the second (base) parameter for those functions. Nice one.
– JohnLBevan
Nov 20 '18 at 7:09
1
1
Thanks a lot for answering my question. But is there any possibility to do the bits and not numbers. Regards
– Khabat Rammo
Nov 19 '18 at 22:27
Thanks a lot for answering my question. But is there any possibility to do the bits and not numbers. Regards
– Khabat Rammo
Nov 19 '18 at 22:27
Sure... Under the covers they're the same thing; i.e. a number's just a collection of bits. So it's only at display or input time that this makes a difference... I've added a couple of functions which allow you to convert from/to the display values (I've used 1s and 0s, but you could easily amend it to work with
rs and fs.– JohnLBevan
Nov 19 '18 at 22:38
Sure... Under the covers they're the same thing; i.e. a number's just a collection of bits. So it's only at display or input time that this makes a difference... I've added a couple of functions which allow you to convert from/to the display values (I've used 1s and 0s, but you could easily amend it to work with
rs and fs.– JohnLBevan
Nov 19 '18 at 22:38
1
1
PERFECT. Thanks a loot.
– Khabat Rammo
Nov 19 '18 at 22:43
PERFECT. Thanks a loot.
– Khabat Rammo
Nov 19 '18 at 22:43
1
1
Helpful, but note that
-bnot ($a -bxor $b) doesn't yield 11111010 (250), it yields 11111111111111111111111111111010 (-6), because the smallest data type that PowerShell's binary operators return is [int], so you need to mask out the higher bits. No real need for custom functions, because .NET supports these conversions directly: $bin = [Convert]::ToString(9, 2) and [Convert]::ToByte($bin, 2)– mklement0
Nov 20 '18 at 4:48
Helpful, but note that
-bnot ($a -bxor $b) doesn't yield 11111010 (250), it yields 11111111111111111111111111111010 (-6), because the smallest data type that PowerShell's binary operators return is [int], so you need to mask out the higher bits. No real need for custom functions, because .NET supports these conversions directly: $bin = [Convert]::ToString(9, 2) and [Convert]::ToByte($bin, 2)– mklement0
Nov 20 '18 at 4:48
1
1
Thanks @mklement0, I wasn't aware of the second (base) parameter for those functions. Nice one.
– JohnLBevan
Nov 20 '18 at 7:09
Thanks @mklement0, I wasn't aware of the second (base) parameter for those functions. Nice one.
– JohnLBevan
Nov 20 '18 at 7:09
add a comment |
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53383139%2fhamming-distance-comparison-with-powershell%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown

2
$Result = -bNot $First -xor $Second– iRon
Nov 19 '18 at 22:09