<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Owen Rees</title>
    <description>The latest articles on DEV Community by Owen Rees (@therealowenrees).</description>
    <link>https://dev.to/therealowenrees</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F741049%2F6b8a75de-14bb-4b16-aead-62ce074e3366.jpeg</url>
      <title>DEV Community: Owen Rees</title>
      <link>https://dev.to/therealowenrees</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/therealowenrees"/>
    <language>en</language>
    <item>
      <title>Utilising Bitwise Operators in JavaScript, by Building a RGB to Hex Colour Convertor</title>
      <dc:creator>Owen Rees</dc:creator>
      <pubDate>Thu, 23 Nov 2023 13:52:58 +0000</pubDate>
      <link>https://dev.to/therealowenrees/utilising-bitwise-operators-in-javascript-by-building-a-rgb-to-hex-colour-convertor-24ai</link>
      <guid>https://dev.to/therealowenrees/utilising-bitwise-operators-in-javascript-by-building-a-rgb-to-hex-colour-convertor-24ai</guid>
      <description>&lt;h2&gt;
  
  
  A Real World Example of Bitwise AND, OR, and Left/Right Shift
&lt;/h2&gt;

&lt;p&gt;Bitwise operators are a seldomly used part of the JavaScript language, being much more popular in low-level languages such as C. After my &lt;a href="https://dev.to/therealowenrees/using-bitwise-xor-to-solve-the-lonely-integer-problem-2ea8"&gt;previous article&lt;/a&gt; on solving a popular coding challenge using the Bitwise XOR operator, we are now going to look at a real world example of using some other bitwise operators, by creating our own RGB to Hex and Hex to RGB colour convertors. These colour code convertors can also be created without using bitwise operators, but that wouldn't be as fun!&lt;/p&gt;

&lt;h3&gt;
  
  
  The Lineup
&lt;/h3&gt;

&lt;p&gt;In this article, we will be using the following bitwise operators:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Bitwise_AND" rel="noopener noreferrer"&gt;AND (&amp;amp;)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Bitwise_OR" rel="noopener noreferrer"&gt;OR (|)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Left_shift" rel="noopener noreferrer"&gt;Left Shift (&amp;lt;&amp;lt;)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Right_shift" rel="noopener noreferrer"&gt;Right Shift (&amp;gt;&amp;gt;)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Please pay attention to the &lt;code&gt;&amp;amp;&lt;/code&gt; and &lt;code&gt;|&lt;/code&gt; symbols, as they look similar to their logical counterparts &lt;code&gt;&amp;amp;&amp;amp;&lt;/code&gt; and &lt;code&gt;||&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;In this article we can afford a bit more time to talk about how each of these operators functions.&lt;/p&gt;

&lt;h4&gt;
  
  
  Bitwise AND (&amp;amp;)
&lt;/h4&gt;

&lt;p&gt;Bitwise AND is truthy when the two bits being compared are &lt;code&gt;1&lt;/code&gt;, otherwise falsy.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;x&lt;/th&gt;
&lt;th&gt;y&lt;/th&gt;
&lt;th&gt;x AND y&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Comparing two binary representations of numbers, each bit is compared against the other, and the resulting bit is set to &lt;code&gt;1&lt;/code&gt; or &lt;code&gt;0&lt;/code&gt; depending on the evaluation.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt; &lt;span class="c1"&gt;// 2&lt;/span&gt;

&lt;span class="c1"&gt;// compare each column:&lt;/span&gt;
&lt;span class="mi"&gt;1010&lt;/span&gt;    &lt;span class="c1"&gt;// 10&lt;/span&gt;
&lt;span class="mi"&gt;0110&lt;/span&gt;    &lt;span class="c1"&gt;// 5&lt;/span&gt;
&lt;span class="o"&gt;----&lt;/span&gt;
&lt;span class="mi"&gt;0010&lt;/span&gt;    &lt;span class="c1"&gt;// 2&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Bitwise OR (|)
&lt;/h4&gt;

&lt;p&gt;Bitwise OR is truthy when when either or both bits are &lt;code&gt;1&lt;/code&gt;.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;x&lt;/th&gt;
&lt;th&gt;y&lt;/th&gt;
&lt;th&gt;x OR y&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt; &lt;span class="c1"&gt;// 13&lt;/span&gt;

&lt;span class="c1"&gt;// compare each column&lt;/span&gt;
&lt;span class="mi"&gt;1010&lt;/span&gt;    &lt;span class="c1"&gt;// 10&lt;/span&gt;
&lt;span class="mi"&gt;0110&lt;/span&gt;    &lt;span class="c1"&gt;// 5&lt;/span&gt;
&lt;span class="o"&gt;----&lt;/span&gt;
&lt;span class="mi"&gt;1110&lt;/span&gt;    &lt;span class="c1"&gt;// 13&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Bitwise Left Shift
&lt;/h4&gt;

&lt;p&gt;This operator shifts the bits to the left by the specified amount, while shifting in zero bits from the right. We will use an equal amount of bits for the comparisions, for easier visualisation.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// we can see that the singular 1 has been moved to the left by 4 places&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt; &lt;span class="c1"&gt;// 128&lt;/span&gt;
&lt;span class="mi"&gt;0000&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt; &lt;span class="mi"&gt;0000&lt;/span&gt; 

&lt;span class="c1"&gt;// the bits have all been shifted to the left 3 places&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;55&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;440&lt;/span&gt;
&lt;span class="mi"&gt;0000&lt;/span&gt; &lt;span class="mi"&gt;0011&lt;/span&gt; &lt;span class="mi"&gt;0111&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0001&lt;/span&gt; &lt;span class="mi"&gt;1011&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Bitwise Right Shift
&lt;/h4&gt;

&lt;p&gt;This operator shifts the bits to the right by the specified amount, where excess digits are pushed off the right.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;256&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt; &lt;span class="c1"&gt;// 32&lt;/span&gt;
&lt;span class="mi"&gt;0001&lt;/span&gt; &lt;span class="mi"&gt;0000&lt;/span&gt; &lt;span class="mi"&gt;0000&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0000&lt;/span&gt; &lt;span class="mi"&gt;0010&lt;/span&gt; &lt;span class="mi"&gt;0000&lt;/span&gt;

&lt;span class="c1"&gt;// here we see excess bits being pushed off the edge on the right&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;440&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt; &lt;span class="c1"&gt;// 6&lt;/span&gt;
&lt;span class="mi"&gt;0001&lt;/span&gt; &lt;span class="mi"&gt;1011&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0000&lt;/span&gt; &lt;span class="mi"&gt;0000&lt;/span&gt; &lt;span class="mi"&gt;0110&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  RGB to Hex
&lt;/h3&gt;

&lt;p&gt;Let's take the Hex colour code &lt;code&gt;#157f4c&lt;/code&gt;. First we must understand what the Hex colour code represents. Rather than being a large hexdecimal number &lt;code&gt;(0x157f4c = 1408844)&lt;/code&gt;, we must split this into groups of 2, each representing the value of R, G, and B.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Hexadecimal&lt;/th&gt;
&lt;th&gt;Decimal&lt;/th&gt;
&lt;th&gt;Binary&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;0x15&lt;/td&gt;
&lt;td&gt;21&lt;/td&gt;
&lt;td&gt;00010101&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0x7f&lt;/td&gt;
&lt;td&gt;127&lt;/td&gt;
&lt;td&gt;01111111&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0x4c&lt;/td&gt;
&lt;td&gt;76&lt;/td&gt;
&lt;td&gt;01001100&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Our RGB value is 21, 127, 76&lt;/p&gt;

&lt;p&gt;Our goal is to make one long 24-bit binary representation of our RGB values, as such:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;21&lt;/th&gt;
&lt;th&gt;127&lt;/th&gt;
&lt;th&gt;76&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;00010101&lt;/td&gt;
&lt;td&gt;01111111&lt;/td&gt;
&lt;td&gt;01001100&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;code&gt;00010101 01111111 01001100&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;To achieve this, we need to move the bits for the R and G values to the left, by 16 and 8 bits respectively. For this we will use the &lt;code&gt;Bitwise Left Shift (&amp;lt;&amp;lt;)&lt;/code&gt; operator.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Binary representations are in 24-bit space&lt;/span&gt;

&lt;span class="c1"&gt;// R value&lt;/span&gt;
&lt;span class="mi"&gt;00000000&lt;/span&gt; &lt;span class="mi"&gt;00000000&lt;/span&gt; &lt;span class="mi"&gt;00010101&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;16&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;00010101&lt;/span&gt; &lt;span class="mi"&gt;00000000&lt;/span&gt; &lt;span class="mi"&gt;00000000&lt;/span&gt;

&lt;span class="c1"&gt;// G value&lt;/span&gt;
&lt;span class="mi"&gt;00000000&lt;/span&gt; &lt;span class="mi"&gt;00000000&lt;/span&gt; &lt;span class="mi"&gt;01111111&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;00000000&lt;/span&gt; &lt;span class="mi"&gt;01111111&lt;/span&gt; &lt;span class="mi"&gt;00000000&lt;/span&gt;

&lt;span class="c1"&gt;// B value&lt;/span&gt;
&lt;span class="mi"&gt;00000000&lt;/span&gt; &lt;span class="mi"&gt;00000000&lt;/span&gt; &lt;span class="mi"&gt;01001100&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We have three binary numbers, and we need to create one long 24-bit binary number with them. We can achieve this using the &lt;code&gt;Bitwise OR (|)&lt;/code&gt; operator, as follows:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// R | G, compare each column using the rules for the bitwise OR operator&lt;/span&gt;
&lt;span class="mi"&gt;00010101&lt;/span&gt; &lt;span class="mi"&gt;00000000&lt;/span&gt; &lt;span class="mi"&gt;00000000&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;
&lt;span class="mi"&gt;00000000&lt;/span&gt; &lt;span class="mi"&gt;01111111&lt;/span&gt; &lt;span class="mi"&gt;00000000&lt;/span&gt;
&lt;span class="o"&gt;--------------------------&lt;/span&gt;
&lt;span class="mi"&gt;00010101&lt;/span&gt; &lt;span class="mi"&gt;01111111&lt;/span&gt; &lt;span class="mi"&gt;00000000&lt;/span&gt;

&lt;span class="c1"&gt;// and now this new value | B&lt;/span&gt;
&lt;span class="mi"&gt;00010101&lt;/span&gt; &lt;span class="mi"&gt;01111111&lt;/span&gt; &lt;span class="mi"&gt;00000000&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;
&lt;span class="mi"&gt;00000000&lt;/span&gt; &lt;span class="mi"&gt;00000000&lt;/span&gt; &lt;span class="mi"&gt;01001100&lt;/span&gt;
&lt;span class="o"&gt;--------------------------&lt;/span&gt;
&lt;span class="mi"&gt;00010101&lt;/span&gt; &lt;span class="mi"&gt;01111111&lt;/span&gt; &lt;span class="mi"&gt;01001100&lt;/span&gt;  &lt;span class="c1"&gt;// the desired binary representation of our RGB values&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pay attention to how the bitwise OR is working in the above example, concatenating the binary values into one long value.&lt;/p&gt;

&lt;p&gt;Let us now write a function to tie this all together.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;rgbToHex&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;rgb&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// shifting the bits to the left and comparing with bitwise OR&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;binaryRGB&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;rgb&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;16&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="nx"&gt;rgb&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="nx"&gt;rgb&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;   
    &lt;span class="c1"&gt;// convert the binaryRGB string to a hexadecimal (base-16) string&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;hex&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;binaryRGB&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;      
    &lt;span class="c1"&gt;// add '#' to the beginning. Make sure the returned value is always 6 characters long, padding with a 0 if not.&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s2"&gt;`#&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;hex&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;padStart&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;0&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt; 
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;rgbToHex&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="mi"&gt;21&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;127&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;76&lt;/span&gt;&lt;span class="p"&gt;]))&lt;/span&gt;  &lt;span class="c1"&gt;// values taken from a form etc. &lt;/span&gt;
&lt;span class="c1"&gt;// '#157f4c'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Hex to RGB
&lt;/h3&gt;

&lt;p&gt;And now to do the inverse, taking a Hex colour value and returning RGB values. Let's use the same Hex code that the previous section returned, to prove that it is correct by returning our original RGB values.&lt;/p&gt;

&lt;p&gt;First of all, we need to work with a real hexadecimal value:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;hex&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#15014c&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;0x&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;// '0x15014c'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If we view this hexadecimal in its binary representation again, we get:&lt;br&gt;
&lt;code&gt;00010101 01111111 01001100&lt;/code&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;R&lt;/th&gt;
&lt;th&gt;G&lt;/th&gt;
&lt;th&gt;B&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;00010101&lt;/td&gt;
&lt;td&gt;01111111&lt;/td&gt;
&lt;td&gt;01001100&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;21&lt;/td&gt;
&lt;td&gt;127&lt;/td&gt;
&lt;td&gt;76&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Now we need to store each of the R, G, and B values in their own variables. In order to create the correct binary number for each of these values, we must now bitwise right shift the R and G values by 16 and 8 bits respectively.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="mi"&gt;00010101&lt;/span&gt; &lt;span class="mi"&gt;01111111&lt;/span&gt; &lt;span class="mi"&gt;01001100&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;16&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;00000000&lt;/span&gt; &lt;span class="mi"&gt;00000000&lt;/span&gt; &lt;span class="mi"&gt;00010101&lt;/span&gt; &lt;span class="c1"&gt;// R (21)&lt;/span&gt;
&lt;span class="mi"&gt;00010101&lt;/span&gt; &lt;span class="mi"&gt;01111111&lt;/span&gt; &lt;span class="mi"&gt;01001100&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;00000000&lt;/span&gt; &lt;span class="mi"&gt;00010101&lt;/span&gt; &lt;span class="mi"&gt;01111111&lt;/span&gt;  &lt;span class="c1"&gt;// G (4319)&lt;/span&gt;
&lt;span class="mi"&gt;00010101&lt;/span&gt; &lt;span class="mi"&gt;01111111&lt;/span&gt; &lt;span class="mi"&gt;01001100&lt;/span&gt; &lt;span class="c1"&gt;// G (219948)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Wait, these values are incorrect! We need to take one more very important step, which would leave us with just the required bits.&lt;/p&gt;

&lt;p&gt;Comparing the binary representation with &lt;code&gt;Bitwise AND (&amp;amp;)&lt;/code&gt; against &lt;code&gt;11111111&lt;/code&gt; will leave us with just the last 8 bits of information.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Compare the columns&lt;/span&gt;

&lt;span class="c1"&gt;// R&lt;/span&gt;
&lt;span class="mi"&gt;00000000&lt;/span&gt; &lt;span class="mi"&gt;00000000&lt;/span&gt; &lt;span class="mi"&gt;00010101&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;
&lt;span class="mi"&gt;00000000&lt;/span&gt; &lt;span class="mi"&gt;00000000&lt;/span&gt; &lt;span class="mi"&gt;11111111&lt;/span&gt;
&lt;span class="o"&gt;--------------------------&lt;/span&gt;
&lt;span class="mi"&gt;00000000&lt;/span&gt; &lt;span class="mi"&gt;00000000&lt;/span&gt; &lt;span class="mi"&gt;00010101&lt;/span&gt;  &lt;span class="c1"&gt;// (21)&lt;/span&gt;

&lt;span class="c1"&gt;// G&lt;/span&gt;
&lt;span class="mi"&gt;00000000&lt;/span&gt; &lt;span class="mi"&gt;00010101&lt;/span&gt; &lt;span class="mi"&gt;01111111&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;
&lt;span class="mi"&gt;00000000&lt;/span&gt; &lt;span class="mi"&gt;00000000&lt;/span&gt; &lt;span class="mi"&gt;11111111&lt;/span&gt;
&lt;span class="o"&gt;--------------------------&lt;/span&gt;
&lt;span class="mi"&gt;00000000&lt;/span&gt; &lt;span class="mi"&gt;00000000&lt;/span&gt; &lt;span class="mi"&gt;01111111&lt;/span&gt;  &lt;span class="c1"&gt;// (127)&lt;/span&gt;

&lt;span class="c1"&gt;// B&lt;/span&gt;
&lt;span class="mi"&gt;00010101&lt;/span&gt; &lt;span class="mi"&gt;01111111&lt;/span&gt; &lt;span class="mi"&gt;01001100&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;
&lt;span class="mi"&gt;00000000&lt;/span&gt; &lt;span class="mi"&gt;00000000&lt;/span&gt; &lt;span class="mi"&gt;11111111&lt;/span&gt;
&lt;span class="o"&gt;--------------------------&lt;/span&gt;
&lt;span class="mi"&gt;00000000&lt;/span&gt; &lt;span class="mi"&gt;00000000&lt;/span&gt; &lt;span class="mi"&gt;01001100&lt;/span&gt;  &lt;span class="c1"&gt;// (76)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pay attention to how the bitwise AND operator works in the above examples, and how it leaves us with only the required information.&lt;/p&gt;

&lt;p&gt;Let us now tie this all together in a function.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;hexToRgb&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;hexColour&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// replace '#' with '0x' to give us a real hexadecimal string to work with&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;hex&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;hexColour&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;0x&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  

    &lt;span class="c1"&gt;// right shift the respective bits&lt;/span&gt;
    &lt;span class="c1"&gt;// followed bit masking with bitwise AND against '11111111' (0xff in hexadecimal)&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;r&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;hex&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;16&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="mh"&gt;0xff&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;g&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;hex&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="mh"&gt;0xff&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;hex&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="mh"&gt;0xff&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;r&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;g&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="c1"&gt;// return an array of the RGB values&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;hexToRgb&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#15014c&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="c1"&gt;// [ 21, 1, 76 ]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Conclusion
&lt;/h3&gt;

&lt;p&gt;In this article we saw a real world example of using bitwise operators in JavaScript, by building a RGB to Hex and Hex to RGB colour convertors. If you have never dealt with bitwise operators before, there is a lot to take in here. However there is no better way to learn a concept than by actually building something!&lt;/p&gt;

&lt;p&gt;If you are looking for further reading on the topic, try the following articles:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://dev.to/isiakaabd/introduction-to-javascript-bitwise-operators-4i5e"&gt;JavaScript Bitwise Operators&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators" rel="noopener noreferrer"&gt;MDN - Expressions and Operators&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.digitalocean.com/community/tutorials/using-bitwise-operators-in-javascript" rel="noopener noreferrer"&gt;Using Bitwise operators in JavaScript&lt;/a&gt;&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>bitwise</category>
      <category>programming</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Using Bitwise XOR to Solve the 'Lonely Integer' Problem</title>
      <dc:creator>Owen Rees</dc:creator>
      <pubDate>Sat, 18 Nov 2023 11:42:06 +0000</pubDate>
      <link>https://dev.to/therealowenrees/using-bitwise-xor-to-solve-the-lonely-integer-problem-2ea8</link>
      <guid>https://dev.to/therealowenrees/using-bitwise-xor-to-solve-the-lonely-integer-problem-2ea8</guid>
      <description>&lt;p&gt;The Lonely Integer problem is a common coding challenge used to test your ability to count or filter numbers in an array, with the goal of isolating the number which appears only once. On HackerRank, the definition is as follows:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Given an array of integers, where all elements but one occur twice, find the unique element.&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;Example&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="nx"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;

&lt;span class="nx"&gt;The&lt;/span&gt; &lt;span class="nx"&gt;unique&lt;/span&gt; &lt;span class="nx"&gt;element&lt;/span&gt; &lt;span class="nx"&gt;is&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;There are multiple ways to solve this problem, including counting and filtering, or my personal favourite of utilising a &lt;code&gt;Set&lt;/code&gt; to keep track of elements that have been seen. For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="kd"&gt;set&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Set&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="nx"&gt;numberArray&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;forEach&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;num&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="kd"&gt;set&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;has&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;num&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="kd"&gt;set&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;delete&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;num&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kd"&gt;set&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;num&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;Array&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;from&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;set&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We are going to explore a rather different method, utilising the &lt;a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Bitwise_XOR" rel="noopener noreferrer"&gt;Bitwise XOR (^)&lt;/a&gt; or "exclusive-or" operator.&lt;/p&gt;

&lt;h2&gt;
  
  
  A Summary of Bitwise Operations
&lt;/h2&gt;

&lt;p&gt;We are not going to do a deep dive into how bitwise operators work in JavaScript. If you wish to delve a bit deeper, &lt;a href="https://www.digitalocean.com/community/tutorials/using-bitwise-operators-in-javascript" rel="noopener noreferrer"&gt;this article&lt;/a&gt; will give you a good overview.&lt;/p&gt;

&lt;p&gt;In summary, these operators compare binary representations of numbers, offering faster performance compared to their logical counterparts since computers are optimised for bitwise operations.&lt;/p&gt;

&lt;h3&gt;
  
  
  Bitwise XOR
&lt;/h3&gt;

&lt;p&gt;The Bitwise XOR is an "exclusive-or" operator, which has subtle differences compared to the &lt;code&gt;Bitwise OR&lt;/code&gt; operator.&lt;/p&gt;

&lt;p&gt;Let us first look at the &lt;code&gt;Bitwise OR (|)&lt;/code&gt; operand. &lt;a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Bitwise_OR" rel="noopener noreferrer"&gt;MDN&lt;/a&gt; defines &lt;code&gt;Bitwise OR&lt;/code&gt; as returning a number &lt;em&gt;whose binary representation has a 1 in each bit position for which the corresponding bits of either or both operands are 1&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  &lt;span class="c1"&gt;// Binary 0110&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Binary 1010&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;a&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt; &lt;span class="c1"&gt;// 14 (Binary: 1110)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;Bitwise OR&lt;/code&gt; operation produces a truthy result when one or both bits are set to &lt;code&gt;1&lt;/code&gt;. If &lt;code&gt;true&lt;/code&gt;, the result bit is set to &lt;code&gt;1&lt;/code&gt;, otherwise it is set to &lt;code&gt;0&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Bitwise OR (|)&lt;/span&gt;
&lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;   &lt;span class="c1"&gt;// one of the bits = 1&lt;/span&gt;
&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;   &lt;span class="c1"&gt;// both bits = 1&lt;/span&gt;
&lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;   &lt;span class="c1"&gt;// neither bits = 1&lt;/span&gt;

&lt;span class="mi"&gt;0110&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="mi"&gt;1010&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1110&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;Bitwise XOR (^)&lt;/code&gt; operator produces a truthy result when one bit is exclusively set to &lt;code&gt;1&lt;/code&gt; and the other bit is exclusively set to &lt;code&gt;0&lt;/code&gt;. If both bits are set to &lt;code&gt;1&lt;/code&gt;, the result is not truthy. If &lt;code&gt;true&lt;/code&gt;, the result bit is set to &lt;code&gt;1&lt;/code&gt;, otherwise it is set to &lt;code&gt;0&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  &lt;span class="c1"&gt;// Binary 0110&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Binary 1010&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;a&lt;/span&gt; &lt;span class="o"&gt;^&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt; &lt;span class="c1"&gt;// 12 (Binary: 1100)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is calculated as follows:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Bitwise XOR (^)&lt;/span&gt;
&lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="o"&gt;^&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;   &lt;span class="c1"&gt;// one bit exclusively = 1&lt;/span&gt;
&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;^&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;   &lt;span class="c1"&gt;// neither bit exlusively = 1&lt;/span&gt;
&lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="o"&gt;^&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;   &lt;span class="c1"&gt;// neither bits exclusively = `1`&lt;/span&gt;

&lt;span class="mi"&gt;0110&lt;/span&gt; &lt;span class="o"&gt;^&lt;/span&gt; &lt;span class="mi"&gt;1010&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1100&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Cancelling Out Numbers Using Bitwise XOR
&lt;/h3&gt;

&lt;p&gt;If we take the same integer twice and perform a &lt;code&gt;Bitwise XOR&lt;/code&gt; operation on them, they cancel each other out and return &lt;code&gt;0&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;     &lt;span class="c1"&gt;// Binary 1&lt;/span&gt;
&lt;span class="nx"&gt;a&lt;/span&gt; &lt;span class="o"&gt;^&lt;/span&gt; &lt;span class="nx"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;       &lt;span class="c1"&gt;// 1 ^ 1 = 0 since one bit is not exclusiely set to 1&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;     &lt;span class="c1"&gt;// Binary 101&lt;/span&gt;
&lt;span class="nx"&gt;b&lt;/span&gt; &lt;span class="o"&gt;^&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;       &lt;span class="c1"&gt;// 101 ^ 101 = 000 since none of the corresponding bits are exclusively set to 1&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Using Bitwise XOR to Solve the Lonely Integer Problem
&lt;/h3&gt;

&lt;p&gt;As demonstrated earlier, when an even number of identical integers is compared using Bitwise XOR, the result nullifies them, while an odd number of the same integer will yield the original integer. &lt;/p&gt;

&lt;p&gt;We can iterate through the integers in the array and keep the results of our comparisons in a variable using the &lt;code&gt;Bitwise XOR assingment operator (^=)&lt;/code&gt;. Let's begin by examining some manual calculations for this process:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;arr1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;  &lt;span class="c1"&gt;// Binary [01, 10, 01] with 2 bits for easier visualisation&lt;/span&gt;
&lt;span class="mi"&gt;01&lt;/span&gt; &lt;span class="o"&gt;^&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;11&lt;/span&gt;            &lt;span class="c1"&gt;// use the new binary number to compare against the next element in the array&lt;/span&gt;
&lt;span class="mi"&gt;11&lt;/span&gt; &lt;span class="o"&gt;^&lt;/span&gt; &lt;span class="mi"&gt;01&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;            &lt;span class="c1"&gt;// 2, the unique element in the array&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;arr2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;  &lt;span class="c1"&gt;// Binary [001, 010, 011, 100, 011, 010, 001]&lt;/span&gt;
&lt;span class="mi"&gt;001&lt;/span&gt; &lt;span class="o"&gt;^&lt;/span&gt; &lt;span class="mi"&gt;010&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;011&lt;/span&gt;     &lt;span class="c1"&gt;// 1 ^ 2 = 3&lt;/span&gt;
&lt;span class="mi"&gt;011&lt;/span&gt; &lt;span class="o"&gt;^&lt;/span&gt; &lt;span class="mi"&gt;011&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;000&lt;/span&gt;     &lt;span class="c1"&gt;// 3 ^ 3 = 0&lt;/span&gt;
&lt;span class="mi"&gt;000&lt;/span&gt; &lt;span class="o"&gt;^&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;     &lt;span class="c1"&gt;// 0 ^ 4 = 4&lt;/span&gt;
&lt;span class="mi"&gt;100&lt;/span&gt; &lt;span class="o"&gt;^&lt;/span&gt; &lt;span class="mi"&gt;011&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;111&lt;/span&gt;     &lt;span class="c1"&gt;// 4 ^ 3 = 7&lt;/span&gt;
&lt;span class="mi"&gt;111&lt;/span&gt; &lt;span class="o"&gt;^&lt;/span&gt; &lt;span class="mi"&gt;010&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;101&lt;/span&gt;     &lt;span class="c1"&gt;// 7 ^ 2 = 5&lt;/span&gt;
&lt;span class="mi"&gt;101&lt;/span&gt; &lt;span class="o"&gt;^&lt;/span&gt; &lt;span class="mi"&gt;001&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;     &lt;span class="c1"&gt;// 5 ^ 1 = 4, the unique element in the array&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;By maintaining a record of the resulting bits, we can conduct Bitwise XOR comparisons on them while iterating through the array.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;array&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="c1"&gt;// Binary [101, 011, 100, 001, 001, 011, 010, 100, 101]&lt;/span&gt;

&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;total&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
&lt;span class="nx"&gt;array&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;forEach&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;n&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;total&lt;/span&gt; &lt;span class="o"&gt;^=&lt;/span&gt; &lt;span class="nx"&gt;n&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;total&lt;/span&gt;    &lt;span class="c1"&gt;// 2&lt;/span&gt;

&lt;span class="c1"&gt;// each iteration works as follows:&lt;/span&gt;
&lt;span class="mi"&gt;101&lt;/span&gt; &lt;span class="o"&gt;^&lt;/span&gt; &lt;span class="mi"&gt;011&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;110&lt;/span&gt;     &lt;span class="c1"&gt;// 5 ^ 3 = 6&lt;/span&gt;
&lt;span class="mi"&gt;110&lt;/span&gt; &lt;span class="o"&gt;^&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;010&lt;/span&gt;     &lt;span class="c1"&gt;// 6 ^ 4 = 2&lt;/span&gt;
&lt;span class="mi"&gt;010&lt;/span&gt; &lt;span class="o"&gt;^&lt;/span&gt; &lt;span class="mi"&gt;001&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;011&lt;/span&gt;     &lt;span class="c1"&gt;// 2 ^ 1 = 3&lt;/span&gt;
&lt;span class="mi"&gt;011&lt;/span&gt; &lt;span class="o"&gt;^&lt;/span&gt; &lt;span class="mi"&gt;001&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;010&lt;/span&gt;     &lt;span class="c1"&gt;// 3 ^ 1 = 2&lt;/span&gt;
&lt;span class="mi"&gt;010&lt;/span&gt; &lt;span class="o"&gt;^&lt;/span&gt; &lt;span class="mi"&gt;011&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;001&lt;/span&gt;     &lt;span class="c1"&gt;// 2 ^ 3 = 1&lt;/span&gt;
&lt;span class="mi"&gt;001&lt;/span&gt; &lt;span class="o"&gt;^&lt;/span&gt; &lt;span class="mi"&gt;010&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;011&lt;/span&gt;     &lt;span class="c1"&gt;// 1 ^ 2 = 3&lt;/span&gt;
&lt;span class="mi"&gt;011&lt;/span&gt; &lt;span class="o"&gt;^&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;111&lt;/span&gt;     &lt;span class="c1"&gt;// 3 ^ 4 = 7&lt;/span&gt;
&lt;span class="mi"&gt;111&lt;/span&gt; &lt;span class="o"&gt;^&lt;/span&gt; &lt;span class="mi"&gt;101&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;010&lt;/span&gt;     &lt;span class="c1"&gt;// 7 ^ 5 = 2, the unique element in the array&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;In conclusion, the Bitwise XOR operator proves invaluable in singling out the unique integer within an array, capitalising on the even occurrence of other integers that effectively cancel each other through bitwise exclusive-OR comparisons. This approach can be flexibly extended to address various scenarios, including the identification of odd or even occurrences within an array.&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>bitwise</category>
      <category>programming</category>
      <category>challenge</category>
    </item>
  </channel>
</rss>
