Maroonbells (talk | contribs) |
|||
(3 intermediate revisions by 3 users not shown) | |||
Line 1: | Line 1: | ||
− | {{mirc title|$xor | + | {{mirc title|$xor identifier}}'''$xor''' returns the binary XOR of 2 numbers. |
− | '''$xor''' returns the binary XOR of | + | |
== Synopsis == | == Synopsis == | ||
− | <pre>$xor(<N1>,<N2>) | + | <pre>$xor(<N1>,<N2>)</pre> |
== Parameters == | == Parameters == | ||
− | N1 | + | * '''N1,N2''' = the numbers, in base10/decimal |
− | N2 = | + | |
− | + | Note: Fractions are ignored. valid range is integers from -(2^32-1) through +(2^32-1). Negative numbers within that range are translated from signed 32bit-int to unsigned 32bit-int. i.e. Negative numbers in the range -4294967295 through -1 are replaced by N+4294967296. Numbers outside that range are replaced by the closest valid number. i.e. 4294967296+ is handled as if it's 4294967295, and -4294967296 and lower are handled as if -4294967295 which is then handled as if -4294967295+4294967296=1. This means the result is always in the range 0 thru +4294967295. | |
− | |||
== Properties == | == Properties == | ||
− | |||
None | None | ||
− | |||
== Example == | == Example == | ||
+ | XOR is "Exclusive OR" comparison of a pair of bits. For each bit position it returns 0 if BOTH or NEITHER bits are 1, and returns 1 if exactly 1 of the pair is a 1-bit. In effect, every 1-bit in the 2nd number toggles the 0/1 state of the corresponding bit of the 1st number<br /> | ||
− | + | <source lang=mirc>//echo -a $xor(21,9) | |
− | + | ; returns 28</source> | |
− | < | ||
− | ; returns 28</ | ||
Here's how the answer was calculated: | Here's how the answer was calculated: | ||
+ | # If either number is below -4294967295 replace it with -4294967295 | ||
+ | # If either number is above +4294967295 replace it with +4294967295 | ||
+ | # If either number is below zero, add 4294967296 to bring it into range of 0 through 4294967295 | ||
# Convert each number to binary, then line them up vertically so there are 2 rows, where each position pair is a single column. | # Convert each number to binary, then line them up vertically so there are 2 rows, where each position pair is a single column. | ||
# Create a 3rd row, where each column's 0 or 1 value is the XOR of the bit pair directly above it | # Create a 3rd row, where each column's 0 or 1 value is the XOR of the bit pair directly above it | ||
# Convert the 3rd row from binary to base 10. | # Convert the 3rd row from binary to base 10. | ||
− | < | + | <source lang=mirc>//echo -a $base(21,10,2,8) | echo -a $base(9,10,2,8) | echo -a $str(-,8) | echo -a $base($xor(21,9),10,2,8) |
; returns: | ; returns: | ||
00010101 | 00010101 | ||
Line 33: | Line 32: | ||
-------- | -------- | ||
00011100 | 00011100 | ||
− | </ | + | </source> |
The columns where both numbers are zero remain 0. The columns where only 1 of the 2 values is 1, and the column where both values were 1 is zero. | The columns where both numbers are zero remain 0. The columns where only 1 of the 2 values is 1, and the column where both values were 1 is zero. | ||
Line 39: | Line 38: | ||
$xor then returns the answer in base 10. Depending on which bits have changed to 0 or 1, the answer can be less than or greater than the 2 numbers: | $xor then returns the answer in base 10. Depending on which bits have changed to 0 or 1, the answer can be less than or greater than the 2 numbers: | ||
− | < | + | <source lang=mirc>//echo -a $base(00011100,2,10) |
− | ; returns 28</ | + | ; returns 28</source> |
+ | |||
+ | //echo -a $xor(-1,0) | ||
+ | : returns 4294967295 because -1 was translated to 4294967295 in a preliminary step. Then, the XOR of all numbers in the valid range against 0 is the same number. | ||
+ | |||
+ | //echo -a $xor(4444444444,5555555555) | ||
+ | : returns 0. Both numbers were outside valid range, so both were replaced with 2^32-1, and XOR of the same number against itself is always zero. | ||
+ | |||
+ | //var %a $and(%a,1) | var %b $and(%b,1) | if ($xor(%a,%b)) goto label | ||
+ | : Goes to label only if exactly 1 of the 2 variables is 1 | ||
+ | |||
+ | //echo -a $xor($pi,2.777777) | ||
+ | : result is 1, because both fractions are ignored. | ||
+ | |||
+ | //echo -a $xor(1,2) = 3 and $xor(-1,-2) is same as $xor(4294967295,4294967294) | ||
+ | |||
+ | //echo -a $xor(-9999999999,0) | ||
+ | Invalid negative number replaced with -4294967295, which is replaced with +1. Result is 1. | ||
== Compatibility == | == Compatibility == | ||
{{mIRC compatibility|5.61}} | {{mIRC compatibility|5.61}} | ||
− | |||
== See also == | == See also == | ||
+ | * {{mIRC|$and}} | ||
* {{mIRC|$or}} | * {{mIRC|$or}} | ||
− | |||
* {{mIRC|$not}} | * {{mIRC|$not}} | ||
+ | * {{mIRC|$bitoff}} | ||
* {{mIRC|$biton}} | * {{mIRC|$biton}} | ||
− | |||
* {{mIRC|$isbit}} | * {{mIRC|$isbit}} | ||
− | |||
− |
Latest revision as of 17:11, 20 May 2018
$xor returns the binary XOR of 2 numbers.
Synopsis[edit]
$xor(<N1>,<N2>)
Parameters[edit]
- N1,N2 = the numbers, in base10/decimal
Note: Fractions are ignored. valid range is integers from -(2^32-1) through +(2^32-1). Negative numbers within that range are translated from signed 32bit-int to unsigned 32bit-int. i.e. Negative numbers in the range -4294967295 through -1 are replaced by N+4294967296. Numbers outside that range are replaced by the closest valid number. i.e. 4294967296+ is handled as if it's 4294967295, and -4294967296 and lower are handled as if -4294967295 which is then handled as if -4294967295+4294967296=1. This means the result is always in the range 0 thru +4294967295.
Properties[edit]
None
Example[edit]
XOR is "Exclusive OR" comparison of a pair of bits. For each bit position it returns 0 if BOTH or NEITHER bits are 1, and returns 1 if exactly 1 of the pair is a 1-bit. In effect, every 1-bit in the 2nd number toggles the 0/1 state of the corresponding bit of the 1st number
//echo -a $xor(21,9) ; returns 28
Here's how the answer was calculated:
- If either number is below -4294967295 replace it with -4294967295
- If either number is above +4294967295 replace it with +4294967295
- If either number is below zero, add 4294967296 to bring it into range of 0 through 4294967295
- Convert each number to binary, then line them up vertically so there are 2 rows, where each position pair is a single column.
- Create a 3rd row, where each column's 0 or 1 value is the XOR of the bit pair directly above it
- Convert the 3rd row from binary to base 10.
//echo -a $base(21,10,2,8) | echo -a $base(9,10,2,8) | echo -a $str(-,8) | echo -a $base($xor(21,9),10,2,8) ; returns: 00010101 00001001 -------- 00011100
The columns where both numbers are zero remain 0. The columns where only 1 of the 2 values is 1, and the column where both values were 1 is zero.
$xor then returns the answer in base 10. Depending on which bits have changed to 0 or 1, the answer can be less than or greater than the 2 numbers:
//echo -a $base(00011100,2,10) ; returns 28
//echo -a $xor(-1,0)
- returns 4294967295 because -1 was translated to 4294967295 in a preliminary step. Then, the XOR of all numbers in the valid range against 0 is the same number.
//echo -a $xor(4444444444,5555555555)
- returns 0. Both numbers were outside valid range, so both were replaced with 2^32-1, and XOR of the same number against itself is always zero.
//var %a $and(%a,1) | var %b $and(%b,1) | if ($xor(%a,%b)) goto label
- Goes to label only if exactly 1 of the 2 variables is 1
//echo -a $xor($pi,2.777777)
- result is 1, because both fractions are ignored.
//echo -a $xor(1,2) = 3 and $xor(-1,-2) is same as $xor(4294967295,4294967294)
//echo -a $xor(-9999999999,0) Invalid negative number replaced with -4294967295, which is replaced with +1. Result is 1.
Compatibility[edit]
Added: mIRC v5.61
Added on: 23 Sep 1999
Note: Unless otherwise stated, this was the date of original functionality.
Further enhancements may have been made in later versions.