From WikiChip
Difference between revisions of "mirc/identifiers/$xor"
< mirc‎ | identifiers

 
(3 intermediate revisions by 3 users not shown)
Line 1: Line 1:
{{mirc title|$xor Identifier}}
+
{{mirc title|$xor identifier}}'''$xor''' returns the binary XOR of 2 numbers.
'''$xor''' returns the binary XOR of the 2 parameters.
+
 
  
 
== Synopsis ==
 
== Synopsis ==
<pre>$xor(<N1>,<N2>)
+
<pre>$xor(<N1>,<N2>)</pre>
  
 
== Parameters ==
 
== Parameters ==
N1 = 1st Number
+
* '''N1,N2''' = the numbers, in base10/decimal
N2 = 2nd Number
+
 
Both numbers must be base 10, fractions are ignored.
+
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.
Returns 0 if either number is 2^32 or greater 1.
 
  
 
== 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 />
  
XOR is "Exclusive OR" comparison of a pair of bits. It returns 0 if BOTH or NEITHER are 1-bits, 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>
<pre>//echo -a $xor(21,9)
 
; returns 28</pre>
 
  
 
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.
  
<pre>//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)
+
<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
</pre>
+
</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:
  
<pre>//echo -a $base(00011100,2,10)
+
<source lang=mirc>//echo -a $base(00011100,2,10)
; returns 28</pre>
+
; 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|$and}}
 
 
* {{mIRC|$not}}
 
* {{mIRC|$not}}
 +
* {{mIRC|$bitoff}}
 
* {{mIRC|$biton}}
 
* {{mIRC|$biton}}
* {{mIRC|$bitoff}}
 
 
* {{mIRC|$isbit}}
 
* {{mIRC|$isbit}}
* [[List of identifiers - mIRC]]
 
{{mIRC identifier list}}
 

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:

  1. If either number is below -4294967295 replace it with -4294967295
  2. If either number is above +4294967295 replace it with +4294967295
  3. If either number is below zero, add 4294967296 to bring it into range of 0 through 4294967295
  4. Convert each number to binary, then line them up vertically so there are 2 rows, where each position pair is a single column.
  5. Create a 3rd row, where each column's 0 or 1 value is the XOR of the bit pair directly above it
  6. 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.

See also[edit]