Latest commit

History

History

README.md

Bit Manipulation

Get Bit

This method shifts the relevant bit to the zeroth position. Then we perform AND operation with one which has bit pattern like 0001. This clears all bits from the original number except the relevant one. If the relevant bit is one, the result is 1, otherwise the result is 0.

See getBit.js for further details.

Set Bit

This method shifts 1 over by bitPosition bits, creating a value that looks like 00100. Then we perform OR operation that sets specific bit into 1 but it does not affect on other bits of the number.

See setBit.js for further details.

Clear Bit

This method shifts 1 over by bitPosition bits, creating a value that looks like 00100. Than it inverts this mask to get the number that looks like 11011. Then AND operation is being applied to both the number and the mask. That operation unsets the bit.

See clearBit.js for further details.

Update Bit

This method is a combination of "Clear Bit" and "Set Bit" methods.

See updateBit.js for further details.

isEven

This method determines if the number provided is even. It is based on the fact that odd numbers have their last right bit to be set to 1.

Number: 5 = 0b0101
isEven: false
Number: 4 = 0b0100
isEven: true

See isEven.js for further details.

isPositive

This method determines if the number is positive. It is based on the fact that all positive numbers have their leftmost bit to be set to 0. However, if the number provided is zero or negative zero, it should still return false.

Number: 1 = 0b0001
isPositive: true
Number: -1 = -0b0001
isPositive: false

See isPositive.js for further details.

Multiply By Two

This method shifts original number by one bit to the left. Thus all binary number components (powers of two) are being multiplying by two and thus the number itself is being multiplied by two.

Before the shift
Number: 0b0101 = 5
Powers of two: 0 + 2^2 + 0 + 2^0
After the shift
Number: 0b1010 = 10
Powers of two: 2^3 + 0 + 2^1 + 0

See multiplyByTwo.js for further details.

Divide By Two

This method shifts original number by one bit to the right. Thus all binary number components (powers of two) are being divided by two and thus the number itself is being divided by two without remainder.

Before the shift
Number: 0b0101 = 5
Powers of two: 0 + 2^2 + 0 + 2^0
After the shift
Number: 0b0010 = 2
Powers of two: 0 + 0 + 2^1 + 0

See divideByTwo.js for further details.

Switch Sign

This method make positive numbers to be negative and backwards. To do so it uses "Twos Complement" approach which does it by inverting all of the bits of the number and adding 1 to it.

1101 -3
1110 -2
1111 -1
0000 0
0001 1
0010 2
0011 3

See switchSign.js for further details.

Multiply Two Signed Numbers

This method multiplies two signed integer numbers using bitwise operators. This method is based on the following facts:

a * b can be written in the below formats:
0 if a is zero or b is zero or both a and b are zeroes
2a * (b/2) if b is even
2a * (b - 1)/2 + a if b is odd and positive
2a * (b + 1)/2 - a if b is odd and negative

The advantage of this approach is that in each recursive step one of the operands reduces to half its original value. Hence, the run time complexity is O(log(b)) where b is the operand that reduces to half on each recursive step.

See multiply.js for further details.

Multiply Two Unsigned Numbers

This method multiplies two integer numbers using bitwise operators. This method is based on that "Every number can be denoted as the sum of powers of 2".

The main idea of bitwise multiplication is that every number may be split to the sum of powers of two:

I.e.

19 = 2^4 + 2^1 + 2^0

Then multiplying number x by 19 is equivalent of:

x * 19 = x * 2^4 + x * 2^1 + x * 2^0

Now we need to remember that x * 2^4 is equivalent of shifting x left by 4 bits (x << 4).

See multiplyUnsigned.js for further details.

Count Set Bits

This method counts the number of set bits in a number using bitwise operators. The main idea is that we shift the number right by one bit at a time and check the result of & operation that is 1 if bit is set and 0 otherwise.

Number: 5 = 0b0101
Count of set bits = 2

See countSetBits.js for further details.

Count Bits to Flip One Number to Another

This methods outputs the number of bits required to convert one number to another. This makes use of property that when numbers are XOR-ed the result will be number of different bits.

5 = 0b0101
1 = 0b0001
Count of Bits to be Flipped: 1

See bitsDiff.js for further details.

Count Bits of a Number

To calculate the number of valuable bits we need to shift 1 one bit left each time and see if shifted number is bigger than the input number.

5 = 0b0101
Count of valuable bits is: 3
When we shift 1 four times it will become bigger than 5.

See bitLength.js for further details.

Is Power of Two

This method checks if a number provided is power of two. It uses the following property. Let's say that powerNumber is a number that has been formed as a power of two (i.e. 2, 4, 8, 16 etc.). Then if we'll do & operation between powerNumber and powerNumber - 1 it will return 0 (in case if number is power of two).

Number: 4 = 0b0100
Number: 3 = (4 - 1) = 0b0011
4 & 3 = 0b0100 & 0b0011 = 0b0000 <-- Equal to zero, is power of two.
Number: 10 = 0b01010
Number: 9 = (10 - 1) = 0b01001
10 & 9 = 0b01010 & 0b01001 = 0b01000 <-- Not equal to zero, not a power of two.

See isPowerOfTwo.js for further details.

Full Adder

This method adds up two integer numbers using bitwise operators.

It implements full adder electronics circuit logic to sum two 32-bit integers in two's complement format. It's using the boolean logic to cover all possible cases of adding two input bits: with and without a "carry bit" from adding the previous less-significant stage.

Legend:

  • A: Number A
  • B: Number B
  • ai: ith bit of number A
  • bi: ith bit of number B
  • carryIn: a bit carried in from the previous less-significant stage
  • carryOut: a bit to carry to the next most-significant stage
  • bitSum: The sum of ai, bi, and carryIn
  • resultBin: The full result of adding current stage with all less-significant stages (in binary)
  • resultDec: The full result of adding current stage with all less-significant stages (in decimal)
A = 3: 011
B = 6: 110
┌──────┬────┬────┬─────────┬──────────┬─────────┬───────────┬───────────┐
│ bit │ ai │ bi │ carryIn │ carryOut │ bitSum │ resultBin │ resultDec │
├──────┼────┼────┼─────────┼──────────┼─────────┼───────────┼───────────┤
│ 0 │ 1 │ 0 │ 0 │ 0 │ 1 │ 1 │ 1 │
│ 1 │ 1 │ 1 │ 0 │ 1 │ 0 │ 01 │ 1 │
│ 2 │ 0 │ 1 │ 1 │ 1 │ 0 │ 001 │ 1 │
│ 3 │ 0 │ 0 │ 1 │ 0 │ 1 │ 1001 │ 9 │
└──────┴────┴────┴─────────┴──────────┴─────────┴───────────┴───────────┘

See fullAdder.js for further details.
See Full Adder on YouTube.

References

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Latest commit

History

History

README.md

Bit Manipulation

Get Bit

This method shifts the relevant bit to the zeroth position. Then we perform AND operation with one which has bit pattern like 0001. This clears all bits from the original number except the relevant one. If the relevant bit is one, the result is 1, otherwise the result is 0.

See getBit.js for further details.

Set Bit

This method shifts 1 over by bitPosition bits, creating a value that looks like 00100. Then we perform OR operation that sets specific bit into 1 but it does not affect on other bits of the number.

See setBit.js for further details.

Clear Bit

This method shifts 1 over by bitPosition bits, creating a value that looks like 00100. Than it inverts this mask to get the number that looks like 11011. Then AND operation is being applied to both the number and the mask. That operation unsets the bit.

See clearBit.js for further details.

Update Bit

This method is a combination of "Clear Bit" and "Set Bit" methods.

See updateBit.js for further details.

isEven

This method determines if the number provided is even. It is based on the fact that odd numbers have their last right bit to be set to 1.

Number: 5 = 0b0101
isEven: false
Number: 4 = 0b0100
isEven: true

See isEven.js for further details.

isPositive

This method determines if the number is positive. It is based on the fact that all positive numbers have their leftmost bit to be set to 0. However, if the number provided is zero or negative zero, it should still return false.

Number: 1 = 0b0001
isPositive: true
Number: -1 = -0b0001
isPositive: false

See isPositive.js for further details.

Multiply By Two

This method shifts original number by one bit to the left. Thus all binary number components (powers of two) are being multiplying by two and thus the number itself is being multiplied by two.

Before the shift
Number: 0b0101 = 5
Powers of two: 0 + 2^2 + 0 + 2^0
After the shift
Number: 0b1010 = 10
Powers of two: 2^3 + 0 + 2^1 + 0

See multiplyByTwo.js for further details.

Divide By Two

This method shifts original number by one bit to the right. Thus all binary number components (powers of two) are being divided by two and thus the number itself is being divided by two without remainder.

Before the shift
Number: 0b0101 = 5
Powers of two: 0 + 2^2 + 0 + 2^0
After the shift
Number: 0b0010 = 2
Powers of two: 0 + 0 + 2^1 + 0

See divideByTwo.js for further details.

Switch Sign

This method make positive numbers to be negative and backwards. To do so it uses "Twos Complement" approach which does it by inverting all of the bits of the number and adding 1 to it.

1101 -3
1110 -2
1111 -1
0000 0
0001 1
0010 2
0011 3

See switchSign.js for further details.

Multiply Two Signed Numbers

This method multiplies two signed integer numbers using bitwise operators. This method is based on the following facts:

a * b can be written in the below formats:
0 if a is zero or b is zero or both a and b are zeroes
2a * (b/2) if b is even
2a * (b - 1)/2 + a if b is odd and positive
2a * (b + 1)/2 - a if b is odd and negative

The advantage of this approach is that in each recursive step one of the operands reduces to half its original value. Hence, the run time complexity is O(log(b)) where b is the operand that reduces to half on each recursive step.

See multiply.js for further details.

Multiply Two Unsigned Numbers

This method multiplies two integer numbers using bitwise operators. This method is based on that "Every number can be denoted as the sum of powers of 2".

The main idea of bitwise multiplication is that every number may be split to the sum of powers of two:

I.e.

19 = 2^4 + 2^1 + 2^0

Then multiplying number x by 19 is equivalent of:

x * 19 = x * 2^4 + x * 2^1 + x * 2^0

Now we need to remember that x * 2^4 is equivalent of shifting x left by 4 bits (x << 4).

See multiplyUnsigned.js for further details.

Count Set Bits

This method counts the number of set bits in a number using bitwise operators. The main idea is that we shift the number right by one bit at a time and check the result of & operation that is 1 if bit is set and 0 otherwise.

Number: 5 = 0b0101
Count of set bits = 2

See countSetBits.js for further details.

Count Bits to Flip One Number to Another

This methods outputs the number of bits required to convert one number to another. This makes use of property that when numbers are XOR-ed the result will be number of different bits.

5 = 0b0101
1 = 0b0001
Count of Bits to be Flipped: 1

See bitsDiff.js for further details.

Count Bits of a Number

To calculate the number of valuable bits we need to shift 1 one bit left each time and see if shifted number is bigger than the input number.

5 = 0b0101
Count of valuable bits is: 3
When we shift 1 four times it will become bigger than 5.

See bitLength.js for further details.

Is Power of Two

This method checks if a number provided is power of two. It uses the following property. Let's say that powerNumber is a number that has been formed as a power of two (i.e. 2, 4, 8, 16 etc.). Then if we'll do & operation between powerNumber and powerNumber - 1 it will return 0 (in case if number is power of two).

Number: 4 = 0b0100
Number: 3 = (4 - 1) = 0b0011
4 & 3 = 0b0100 & 0b0011 = 0b0000 <-- Equal to zero, is power of two.
Number: 10 = 0b01010
Number: 9 = (10 - 1) = 0b01001
10 & 9 = 0b01010 & 0b01001 = 0b01000 <-- Not equal to zero, not a power of two.

See isPowerOfTwo.js for further details.

Full Adder

This method adds up two integer numbers using bitwise operators.

It implements full adder electronics circuit logic to sum two 32-bit integers in two's complement format. It's using the boolean logic to cover all possible cases of adding two input bits: with and without a "carry bit" from adding the previous less-significant stage.

Legend:

  • A: Number A
  • B: Number B
  • ai: ith bit of number A
  • bi: ith bit of number B
  • carryIn: a bit carried in from the previous less-significant stage
  • carryOut: a bit to carry to the next most-significant stage
  • bitSum: The sum of ai, bi, and carryIn
  • resultBin: The full result of adding current stage with all less-significant stages (in binary)
  • resultDec: The full result of adding current stage with all less-significant stages (in decimal)
A = 3: 011
B = 6: 110
┌──────┬────┬────┬─────────┬──────────┬─────────┬───────────┬───────────┐
│ bit │ ai │ bi │ carryIn │ carryOut │ bitSum │ resultBin │ resultDec │
├──────┼────┼────┼─────────┼──────────┼─────────┼───────────┼───────────┤
│ 0 │ 1 │ 0 │ 0 │ 0 │ 1 │ 1 │ 1 │
│ 1 │ 1 │ 1 │ 0 │ 1 │ 0 │ 01 │ 1 │
│ 2 │ 0 │ 1 │ 1 │ 1 │ 0 │ 001 │ 1 │
│ 3 │ 0 │ 0 │ 1 │ 0 │ 1 │ 1001 │ 9 │
└──────┴────┴────┴─────────┴──────────┴─────────┴───────────┴───────────┘

See fullAdder.js for further details.
See Full Adder on YouTube.

References

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

History

README.md

Bit Manipulation

Get Bit

This method shifts the relevant bit to the zeroth position. Then we perform AND operation with one which has bit pattern like 0001. This clears all bits from the original number except the relevant one. If the relevant bit is one, the result is 1, otherwise the result is 0.

See getBit.js for further details.

Set Bit

This method shifts 1 over by bitPosition bits, creating a value that looks like 00100. Then we perform OR operation that sets specific bit into 1 but it does not affect on other bits of the number.

See setBit.js for further details.

Clear Bit

This method shifts 1 over by bitPosition bits, creating a value that looks like 00100. Than it inverts this mask to get the number that looks like 11011. Then AND operation is being applied to both the number and the mask. That operation unsets the bit.

See clearBit.js for further details.

Update Bit

This method is a combination of "Clear Bit" and "Set Bit" methods.

See updateBit.js for further details.

isEven

This method determines if the number provided is even. It is based on the fact that odd numbers have their last right bit to be set to 1.

Number: 5 = 0b0101
isEven: false
Number: 4 = 0b0100
isEven: true

See isEven.js for further details.

isPositive

This method determines if the number is positive. It is based on the fact that all positive numbers have their leftmost bit to be set to 0. However, if the number provided is zero or negative zero, it should still return false.

Number: 1 = 0b0001
isPositive: true
Number: -1 = -0b0001
isPositive: false

See isPositive.js for further details.

Multiply By Two

This method shifts original number by one bit to the left. Thus all binary number components (powers of two) are being multiplying by two and thus the number itself is being multiplied by two.

Before the shift
Number: 0b0101 = 5
Powers of two: 0 + 2^2 + 0 + 2^0
After the shift
Number: 0b1010 = 10
Powers of two: 2^3 + 0 + 2^1 + 0

See multiplyByTwo.js for further details.

Divide By Two

This method shifts original number by one bit to the right. Thus all binary number components (powers of two) are being divided by two and thus the number itself is being divided by two without remainder.

Before the shift
Number: 0b0101 = 5
Powers of two: 0 + 2^2 + 0 + 2^0
After the shift
Number: 0b0010 = 2
Powers of two: 0 + 0 + 2^1 + 0

See divideByTwo.js for further details.

Switch Sign

This method make positive numbers to be negative and backwards. To do so it uses "Twos Complement" approach which does it by inverting all of the bits of the number and adding 1 to it.

1101 -3
1110 -2
1111 -1
0000 0
0001 1
0010 2
0011 3

See switchSign.js for further details.

Multiply Two Signed Numbers

This method multiplies two signed integer numbers using bitwise operators. This method is based on the following facts:

a * b can be written in the below formats:
0 if a is zero or b is zero or both a and b are zeroes
2a * (b/2) if b is even
2a * (b - 1)/2 + a if b is odd and positive
2a * (b + 1)/2 - a if b is odd and negative

The advantage of this approach is that in each recursive step one of the operands reduces to half its original value. Hence, the run time complexity is O(log(b)) where b is the operand that reduces to half on each recursive step.

See multiply.js for further details.

Multiply Two Unsigned Numbers

This method multiplies two integer numbers using bitwise operators. This method is based on that "Every number can be denoted as the sum of powers of 2".

The main idea of bitwise multiplication is that every number may be split to the sum of powers of two:

I.e.

19 = 2^4 + 2^1 + 2^0

Then multiplying number x by 19 is equivalent of:

x * 19 = x * 2^4 + x * 2^1 + x * 2^0

Now we need to remember that x * 2^4 is equivalent of shifting x left by 4 bits (x << 4).

See multiplyUnsigned.js for further details.

Count Set Bits

This method counts the number of set bits in a number using bitwise operators. The main idea is that we shift the number right by one bit at a time and check the result of & operation that is 1 if bit is set and 0 otherwise.

Number: 5 = 0b0101
Count of set bits = 2

See countSetBits.js for further details.

Count Bits to Flip One Number to Another

This methods outputs the number of bits required to convert one number to another. This makes use of property that when numbers are XOR-ed the result will be number of different bits.

5 = 0b0101
1 = 0b0001
Count of Bits to be Flipped: 1

See bitsDiff.js for further details.

Count Bits of a Number

To calculate the number of valuable bits we need to shift 1 one bit left each time and see if shifted number is bigger than the input number.

5 = 0b0101
Count of valuable bits is: 3
When we shift 1 four times it will become bigger than 5.

See bitLength.js for further details.

Is Power of Two

This method checks if a number provided is power of two. It uses the following property. Let's say that powerNumber is a number that has been formed as a power of two (i.e. 2, 4, 8, 16 etc.). Then if we'll do & operation between powerNumber and powerNumber - 1 it will return 0 (in case if number is power of two).

Number: 4 = 0b0100
Number: 3 = (4 - 1) = 0b0011
4 & 3 = 0b0100 & 0b0011 = 0b0000 <-- Equal to zero, is power of two.
Number: 10 = 0b01010
Number: 9 = (10 - 1) = 0b01001
10 & 9 = 0b01010 & 0b01001 = 0b01000 <-- Not equal to zero, not a power of two.

See isPowerOfTwo.js for further details.

Full Adder

This method adds up two integer numbers using bitwise operators.

It implements full adder electronics circuit logic to sum two 32-bit integers in two's complement format. It's using the boolean logic to cover all possible cases of adding two input bits: with and without a "carry bit" from adding the previous less-significant stage.

Legend:

  • A: Number A
  • B: Number B
  • ai: ith bit of number A
  • bi: ith bit of number B
  • carryIn: a bit carried in from the previous less-significant stage
  • carryOut: a bit to carry to the next most-significant stage
  • bitSum: The sum of ai, bi, and carryIn
  • resultBin: The full result of adding current stage with all less-significant stages (in binary)
  • resultDec: The full result of adding current stage with all less-significant stages (in decimal)
A = 3: 011
B = 6: 110
┌──────┬────┬────┬─────────┬──────────┬─────────┬───────────┬───────────┐
│ bit │ ai │ bi │ carryIn │ carryOut │ bitSum │ resultBin │ resultDec │
├──────┼────┼────┼─────────┼──────────┼─────────┼───────────┼───────────┤
│ 0 │ 1 │ 0 │ 0 │ 0 │ 1 │ 1 │ 1 │
│ 1 │ 1 │ 1 │ 0 │ 1 │ 0 │ 01 │ 1 │
│ 2 │ 0 │ 1 │ 1 │ 1 │ 0 │ 001 │ 1 │
│ 3 │ 0 │ 0 │ 1 │ 0 │ 1 │ 1001 │ 9 │
└──────┴────┴────┴─────────┴──────────┴─────────┴───────────┴───────────┘

See fullAdder.js for further details.
See Full Adder on YouTube.

References

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

History

README.md

Bit Manipulation

Get Bit

This method shifts the relevant bit to the zeroth position. Then we perform AND operation with one which has bit pattern like 0001. This clears all bits from the original number except the relevant one. If the relevant bit is one, the result is 1, otherwise the result is 0.

See getBit.js for further details.

Set Bit

This method shifts 1 over by bitPosition bits, creating a value that looks like 00100. Then we perform OR operation that sets specific bit into 1 but it does not affect on other bits of the number.

See setBit.js for further details.

Clear Bit

This method shifts 1 over by bitPosition bits, creating a value that looks like 00100. Than it inverts this mask to get the number that looks like 11011. Then AND operation is being applied to both the number and the mask. That operation unsets the bit.

See clearBit.js for further details.

Update Bit

This method is a combination of "Clear Bit" and "Set Bit" methods.

See updateBit.js for further details.

isEven

This method determines if the number provided is even. It is based on the fact that odd numbers have their last right bit to be set to 1.

Number: 5 = 0b0101
isEven: false
Number: 4 = 0b0100
isEven: true

See isEven.js for further details.

isPositive

This method determines if the number is positive. It is based on the fact that all positive numbers have their leftmost bit to be set to 0. However, if the number provided is zero or negative zero, it should still return false.

Number: 1 = 0b0001
isPositive: true
Number: -1 = -0b0001
isPositive: false

See isPositive.js for further details.

Multiply By Two

This method shifts original number by one bit to the left. Thus all binary number components (powers of two) are being multiplying by two and thus the number itself is being multiplied by two.

Before the shift
Number: 0b0101 = 5
Powers of two: 0 + 2^2 + 0 + 2^0
After the shift
Number: 0b1010 = 10
Powers of two: 2^3 + 0 + 2^1 + 0

See multiplyByTwo.js for further details.

Divide By Two

This method shifts original number by one bit to the right. Thus all binary number components (powers of two) are being divided by two and thus the number itself is being divided by two without remainder.

Before the shift
Number: 0b0101 = 5
Powers of two: 0 + 2^2 + 0 + 2^0
After the shift
Number: 0b0010 = 2
Powers of two: 0 + 0 + 2^1 + 0

See divideByTwo.js for further details.

Switch Sign

This method make positive numbers to be negative and backwards. To do so it uses "Twos Complement" approach which does it by inverting all of the bits of the number and adding 1 to it.

1101 -3
1110 -2
1111 -1
0000 0
0001 1
0010 2
0011 3

See switchSign.js for further details.

Multiply Two Signed Numbers

This method multiplies two signed integer numbers using bitwise operators. This method is based on the following facts:

a * b can be written in the below formats:
0 if a is zero or b is zero or both a and b are zeroes
2a * (b/2) if b is even
2a * (b - 1)/2 + a if b is odd and positive
2a * (b + 1)/2 - a if b is odd and negative

The advantage of this approach is that in each recursive step one of the operands reduces to half its original value. Hence, the run time complexity is O(log(b)) where b is the operand that reduces to half on each recursive step.

See multiply.js for further details.

Multiply Two Unsigned Numbers

This method multiplies two integer numbers using bitwise operators. This method is based on that "Every number can be denoted as the sum of powers of 2".

The main idea of bitwise multiplication is that every number may be split to the sum of powers of two:

I.e.

19 = 2^4 + 2^1 + 2^0

Then multiplying number x by 19 is equivalent of:

x * 19 = x * 2^4 + x * 2^1 + x * 2^0

Now we need to remember that x * 2^4 is equivalent of shifting x left by 4 bits (x << 4).

See multiplyUnsigned.js for further details.

Count Set Bits

This method counts the number of set bits in a number using bitwise operators. The main idea is that we shift the number right by one bit at a time and check the result of & operation that is 1 if bit is set and 0 otherwise.

Number: 5 = 0b0101
Count of set bits = 2

See countSetBits.js for further details.

Count Bits to Flip One Number to Another

This methods outputs the number of bits required to convert one number to another. This makes use of property that when numbers are XOR-ed the result will be number of different bits.

5 = 0b0101
1 = 0b0001
Count of Bits to be Flipped: 1

See bitsDiff.js for further details.

Count Bits of a Number

To calculate the number of valuable bits we need to shift 1 one bit left each time and see if shifted number is bigger than the input number.

5 = 0b0101
Count of valuable bits is: 3
When we shift 1 four times it will become bigger than 5.

See bitLength.js for further details.

Is Power of Two

This method checks if a number provided is power of two. It uses the following property. Let's say that powerNumber is a number that has been formed as a power of two (i.e. 2, 4, 8, 16 etc.). Then if we'll do & operation between powerNumber and powerNumber - 1 it will return 0 (in case if number is power of two).

Number: 4 = 0b0100
Number: 3 = (4 - 1) = 0b0011
4 & 3 = 0b0100 & 0b0011 = 0b0000 <-- Equal to zero, is power of two.
Number: 10 = 0b01010
Number: 9 = (10 - 1) = 0b01001
10 & 9 = 0b01010 & 0b01001 = 0b01000 <-- Not equal to zero, not a power of two.

See isPowerOfTwo.js for further details.

Full Adder

This method adds up two integer numbers using bitwise operators.

It implements full adder electronics circuit logic to sum two 32-bit integers in two's complement format. It's using the boolean logic to cover all possible cases of adding two input bits: with and without a "carry bit" from adding the previous less-significant stage.

Legend:

  • A: Number A
  • B: Number B
  • ai: ith bit of number A
  • bi: ith bit of number B
  • carryIn: a bit carried in from the previous less-significant stage
  • carryOut: a bit to carry to the next most-significant stage
  • bitSum: The sum of ai, bi, and carryIn
  • resultBin: The full result of adding current stage with all less-significant stages (in binary)
  • resultDec: The full result of adding current stage with all less-significant stages (in decimal)
A = 3: 011
B = 6: 110
┌──────┬────┬────┬─────────┬──────────┬─────────┬───────────┬───────────┐
│ bit │ ai │ bi │ carryIn │ carryOut │ bitSum │ resultBin │ resultDec │
├──────┼────┼────┼─────────┼──────────┼─────────┼───────────┼───────────┤
│ 0 │ 1 │ 0 │ 0 │ 0 │ 1 │ 1 │ 1 │
│ 1 │ 1 │ 1 │ 0 │ 1 │ 0 │ 01 │ 1 │
│ 2 │ 0 │ 1 │ 1 │ 1 │ 0 │ 001 │ 1 │
│ 3 │ 0 │ 0 │ 1 │ 0 │ 1 │ 1001 │ 9 │
└──────┴────┴────┴─────────┴──────────┴─────────┴───────────┴───────────┘

See fullAdder.js for further details.
See Full Adder on YouTube.

References

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Latest commit

History

History

README.md

Bit Manipulation

Get Bit

This method shifts the relevant bit to the zeroth position. Then we perform AND operation with one which has bit pattern like 0001. This clears all bits from the original number except the relevant one. If the relevant bit is one, the result is 1, otherwise the result is 0.

See getBit.js for further details.

Set Bit

This method shifts 1 over by bitPosition bits, creating a value that looks like 00100. Then we perform OR operation that sets specific bit into 1 but it does not affect on other bits of the number.

See setBit.js for further details.

Clear Bit

This method shifts 1 over by bitPosition bits, creating a value that looks like 00100. Than it inverts this mask to get the number that looks like 11011. Then AND operation is being applied to both the number and the mask. That operation unsets the bit.

See clearBit.js for further details.

Update Bit

This method is a combination of "Clear Bit" and "Set Bit" methods.

See updateBit.js for further details.

isEven

This method determines if the number provided is even. It is based on the fact that odd numbers have their last right bit to be set to 1.

Number: 5 = 0b0101
isEven: false
Number: 4 = 0b0100
isEven: true

See isEven.js for further details.

isPositive

This method determines if the number is positive. It is based on the fact that all positive numbers have their leftmost bit to be set to 0. However, if the number provided is zero or negative zero, it should still return false.

Number: 1 = 0b0001
isPositive: true
Number: -1 = -0b0001
isPositive: false

See isPositive.js for further details.

Multiply By Two

This method shifts original number by one bit to the left. Thus all binary number components (powers of two) are being multiplying by two and thus the number itself is being multiplied by two.

Before the shift
Number: 0b0101 = 5
Powers of two: 0 + 2^2 + 0 + 2^0
After the shift
Number: 0b1010 = 10
Powers of two: 2^3 + 0 + 2^1 + 0

See multiplyByTwo.js for further details.

Divide By Two

This method shifts original number by one bit to the right. Thus all binary number components (powers of two) are being divided by two and thus the number itself is being divided by two without remainder.

Before the shift
Number: 0b0101 = 5
Powers of two: 0 + 2^2 + 0 + 2^0
After the shift
Number: 0b0010 = 2
Powers of two: 0 + 0 + 2^1 + 0

See divideByTwo.js for further details.

Switch Sign

This method make positive numbers to be negative and backwards. To do so it uses "Twos Complement" approach which does it by inverting all of the bits of the number and adding 1 to it.

1101 -3
1110 -2
1111 -1
0000 0
0001 1
0010 2
0011 3

See switchSign.js for further details.

Multiply Two Signed Numbers

This method multiplies two signed integer numbers using bitwise operators. This method is based on the following facts:

a * b can be written in the below formats:
0 if a is zero or b is zero or both a and b are zeroes
2a * (b/2) if b is even
2a * (b - 1)/2 + a if b is odd and positive
2a * (b + 1)/2 - a if b is odd and negative

The advantage of this approach is that in each recursive step one of the operands reduces to half its original value. Hence, the run time complexity is O(log(b)) where b is the operand that reduces to half on each recursive step.

See multiply.js for further details.

Multiply Two Unsigned Numbers

This method multiplies two integer numbers using bitwise operators. This method is based on that "Every number can be denoted as the sum of powers of 2".

The main idea of bitwise multiplication is that every number may be split to the sum of powers of two:

I.e.

19 = 2^4 + 2^1 + 2^0

Then multiplying number x by 19 is equivalent of:

x * 19 = x * 2^4 + x * 2^1 + x * 2^0

Now we need to remember that x * 2^4 is equivalent of shifting x left by 4 bits (x << 4).

See multiplyUnsigned.js for further details.

Count Set Bits

This method counts the number of set bits in a number using bitwise operators. The main idea is that we shift the number right by one bit at a time and check the result of & operation that is 1 if bit is set and 0 otherwise.

Number: 5 = 0b0101
Count of set bits = 2

See countSetBits.js for further details.

Count Bits to Flip One Number to Another

This methods outputs the number of bits required to convert one number to another. This makes use of property that when numbers are XOR-ed the result will be number of different bits.

5 = 0b0101
1 = 0b0001
Count of Bits to be Flipped: 1

See bitsDiff.js for further details.

Count Bits of a Number

To calculate the number of valuable bits we need to shift 1 one bit left each time and see if shifted number is bigger than the input number.

5 = 0b0101
Count of valuable bits is: 3
When we shift 1 four times it will become bigger than 5.

See bitLength.js for further details.

Is Power of Two

This method checks if a number provided is power of two. It uses the following property. Let's say that powerNumber is a number that has been formed as a power of two (i.e. 2, 4, 8, 16 etc.). Then if we'll do & operation between powerNumber and powerNumber - 1 it will return 0 (in case if number is power of two).

Number: 4 = 0b0100
Number: 3 = (4 - 1) = 0b0011
4 & 3 = 0b0100 & 0b0011 = 0b0000 <-- Equal to zero, is power of two.
Number: 10 = 0b01010
Number: 9 = (10 - 1) = 0b01001
10 & 9 = 0b01010 & 0b01001 = 0b01000 <-- Not equal to zero, not a power of two.

See isPowerOfTwo.js for further details.

Full Adder

This method adds up two integer numbers using bitwise operators.

It implements full adder electronics circuit logic to sum two 32-bit integers in two's complement format. It's using the boolean logic to cover all possible cases of adding two input bits: with and without a "carry bit" from adding the previous less-significant stage.

Legend:

  • A: Number A
  • B: Number B
  • ai: ith bit of number A
  • bi: ith bit of number B
  • carryIn: a bit carried in from the previous less-significant stage
  • carryOut: a bit to carry to the next most-significant stage
  • bitSum: The sum of ai, bi, and carryIn
  • resultBin: The full result of adding current stage with all less-significant stages (in binary)
  • resultDec: The full result of adding current stage with all less-significant stages (in decimal)
A = 3: 011
B = 6: 110
┌──────┬────┬────┬─────────┬──────────┬─────────┬───────────┬───────────┐
│ bit │ ai │ bi │ carryIn │ carryOut │ bitSum │ resultBin │ resultDec │
├──────┼────┼────┼─────────┼──────────┼─────────┼───────────┼───────────┤
│ 0 │ 1 │ 0 │ 0 │ 0 │ 1 │ 1 │ 1 │
│ 1 │ 1 │ 1 │ 0 │ 1 │ 0 │ 01 │ 1 │
│ 2 │ 0 │ 1 │ 1 │ 1 │ 0 │ 001 │ 1 │
│ 3 │ 0 │ 0 │ 1 │ 0 │ 1 │ 1001 │ 9 │
└──────┴────┴────┴─────────┴──────────┴─────────┴───────────┴───────────┘

See fullAdder.js for further details.
See Full Adder on YouTube.

References

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

History

README.md

Bit Manipulation

Get Bit

This method shifts the relevant bit to the zeroth position. Then we perform AND operation with one which has bit pattern like 0001. This clears all bits from the original number except the relevant one. If the relevant bit is one, the result is 1, otherwise the result is 0.

See getBit.js for further details.

Set Bit

This method shifts 1 over by bitPosition bits, creating a value that looks like 00100. Then we perform OR operation that sets specific bit into 1 but it does not affect on other bits of the number.

See setBit.js for further details.

Clear Bit

This method shifts 1 over by bitPosition bits, creating a value that looks like 00100. Than it inverts this mask to get the number that looks like 11011. Then AND operation is being applied to both the number and the mask. That operation unsets the bit.

See clearBit.js for further details.

Update Bit

This method is a combination of "Clear Bit" and "Set Bit" methods.

See updateBit.js for further details.

isEven

This method determines if the number provided is even. It is based on the fact that odd numbers have their last right bit to be set to 1.

Number: 5 = 0b0101
isEven: false
Number: 4 = 0b0100
isEven: true

See isEven.js for further details.

isPositive

This method determines if the number is positive. It is based on the fact that all positive numbers have their leftmost bit to be set to 0. However, if the number provided is zero or negative zero, it should still return false.

Number: 1 = 0b0001
isPositive: true
Number: -1 = -0b0001
isPositive: false

See isPositive.js for further details.

Multiply By Two

This method shifts original number by one bit to the left. Thus all binary number components (powers of two) are being multiplying by two and thus the number itself is being multiplied by two.

Before the shift
Number: 0b0101 = 5
Powers of two: 0 + 2^2 + 0 + 2^0
After the shift
Number: 0b1010 = 10
Powers of two: 2^3 + 0 + 2^1 + 0

See multiplyByTwo.js for further details.

Divide By Two

This method shifts original number by one bit to the right. Thus all binary number components (powers of two) are being divided by two and thus the number itself is being divided by two without remainder.

Before the shift
Number: 0b0101 = 5
Powers of two: 0 + 2^2 + 0 + 2^0
After the shift
Number: 0b0010 = 2
Powers of two: 0 + 0 + 2^1 + 0

See divideByTwo.js for further details.

Switch Sign

This method make positive numbers to be negative and backwards. To do so it uses "Twos Complement" approach which does it by inverting all of the bits of the number and adding 1 to it.

1101 -3
1110 -2
1111 -1
0000 0
0001 1
0010 2
0011 3

See switchSign.js for further details.

Multiply Two Signed Numbers

This method multiplies two signed integer numbers using bitwise operators. This method is based on the following facts:

a * b can be written in the below formats:
0 if a is zero or b is zero or both a and b are zeroes
2a * (b/2) if b is even
2a * (b - 1)/2 + a if b is odd and positive
2a * (b + 1)/2 - a if b is odd and negative

The advantage of this approach is that in each recursive step one of the operands reduces to half its original value. Hence, the run time complexity is O(log(b)) where b is the operand that reduces to half on each recursive step.

See multiply.js for further details.

Multiply Two Unsigned Numbers

This method multiplies two integer numbers using bitwise operators. This method is based on that "Every number can be denoted as the sum of powers of 2".

The main idea of bitwise multiplication is that every number may be split to the sum of powers of two:

I.e.

19 = 2^4 + 2^1 + 2^0

Then multiplying number x by 19 is equivalent of:

x * 19 = x * 2^4 + x * 2^1 + x * 2^0

Now we need to remember that x * 2^4 is equivalent of shifting x left by 4 bits (x << 4).

See multiplyUnsigned.js for further details.

Count Set Bits

This method counts the number of set bits in a number using bitwise operators. The main idea is that we shift the number right by one bit at a time and check the result of & operation that is 1 if bit is set and 0 otherwise.

Number: 5 = 0b0101
Count of set bits = 2

See countSetBits.js for further details.

Count Bits to Flip One Number to Another

This methods outputs the number of bits required to convert one number to another. This makes use of property that when numbers are XOR-ed the result will be number of different bits.

5 = 0b0101
1 = 0b0001
Count of Bits to be Flipped: 1

See bitsDiff.js for further details.

Count Bits of a Number

To calculate the number of valuable bits we need to shift 1 one bit left each time and see if shifted number is bigger than the input number.

5 = 0b0101
Count of valuable bits is: 3
When we shift 1 four times it will become bigger than 5.

See bitLength.js for further details.

Is Power of Two

This method checks if a number provided is power of two. It uses the following property. Let's say that powerNumber is a number that has been formed as a power of two (i.e. 2, 4, 8, 16 etc.). Then if we'll do & operation between powerNumber and powerNumber - 1 it will return 0 (in case if number is power of two).

Number: 4 = 0b0100
Number: 3 = (4 - 1) = 0b0011
4 & 3 = 0b0100 & 0b0011 = 0b0000 <-- Equal to zero, is power of two.
Number: 10 = 0b01010
Number: 9 = (10 - 1) = 0b01001
10 & 9 = 0b01010 & 0b01001 = 0b01000 <-- Not equal to zero, not a power of two.

See isPowerOfTwo.js for further details.

Full Adder

This method adds up two integer numbers using bitwise operators.

It implements full adder electronics circuit logic to sum two 32-bit integers in two's complement format. It's using the boolean logic to cover all possible cases of adding two input bits: with and without a "carry bit" from adding the previous less-significant stage.

Legend:

  • A: Number A
  • B: Number B
  • ai: ith bit of number A
  • bi: ith bit of number B
  • carryIn: a bit carried in from the previous less-significant stage
  • carryOut: a bit to carry to the next most-significant stage
  • bitSum: The sum of ai, bi, and carryIn
  • resultBin: The full result of adding current stage with all less-significant stages (in binary)
  • resultDec: The full result of adding current stage with all less-significant stages (in decimal)
A = 3: 011
B = 6: 110
┌──────┬────┬────┬─────────┬──────────┬─────────┬───────────┬───────────┐
│ bit │ ai │ bi │ carryIn │ carryOut │ bitSum │ resultBin │ resultDec │
├──────┼────┼────┼─────────┼──────────┼─────────┼───────────┼───────────┤
│ 0 │ 1 │ 0 │ 0 │ 0 │ 1 │ 1 │ 1 │
│ 1 │ 1 │ 1 │ 0 │ 1 │ 0 │ 01 │ 1 │
│ 2 │ 0 │ 1 │ 1 │ 1 │ 0 │ 001 │ 1 │
│ 3 │ 0 │ 0 │ 1 │ 0 │ 1 │ 1001 │ 9 │
└──────┴────┴────┴─────────┴──────────┴─────────┴───────────┴───────────┘

See fullAdder.js for further details.
See Full Adder on YouTube.

References

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

History

README.md

Bit Manipulation

Get Bit

This method shifts the relevant bit to the zeroth position. Then we perform AND operation with one which has bit pattern like 0001. This clears all bits from the original number except the relevant one. If the relevant bit is one, the result is 1, otherwise the result is 0.

See getBit.js for further details.

Set Bit

This method shifts 1 over by bitPosition bits, creating a value that looks like 00100. Then we perform OR operation that sets specific bit into 1 but it does not affect on other bits of the number.

See setBit.js for further details.

Clear Bit

This method shifts 1 over by bitPosition bits, creating a value that looks like 00100. Than it inverts this mask to get the number that looks like 11011. Then AND operation is being applied to both the number and the mask. That operation unsets the bit.

See clearBit.js for further details.

Update Bit

This method is a combination of "Clear Bit" and "Set Bit" methods.

See updateBit.js for further details.

isEven

This method determines if the number provided is even. It is based on the fact that odd numbers have their last right bit to be set to 1.

Number: 5 = 0b0101
isEven: false
Number: 4 = 0b0100
isEven: true

See isEven.js for further details.

isPositive

This method determines if the number is positive. It is based on the fact that all positive numbers have their leftmost bit to be set to 0. However, if the number provided is zero or negative zero, it should still return false.

Number: 1 = 0b0001
isPositive: true
Number: -1 = -0b0001
isPositive: false

See isPositive.js for further details.

Multiply By Two

This method shifts original number by one bit to the left. Thus all binary number components (powers of two) are being multiplying by two and thus the number itself is being multiplied by two.

Before the shift
Number: 0b0101 = 5
Powers of two: 0 + 2^2 + 0 + 2^0
After the shift
Number: 0b1010 = 10
Powers of two: 2^3 + 0 + 2^1 + 0

See multiplyByTwo.js for further details.

Divide By Two

This method shifts original number by one bit to the right. Thus all binary number components (powers of two) are being divided by two and thus the number itself is being divided by two without remainder.

Before the shift
Number: 0b0101 = 5
Powers of two: 0 + 2^2 + 0 + 2^0
After the shift
Number: 0b0010 = 2
Powers of two: 0 + 0 + 2^1 + 0

See divideByTwo.js for further details.

Switch Sign

This method make positive numbers to be negative and backwards. To do so it uses "Twos Complement" approach which does it by inverting all of the bits of the number and adding 1 to it.

1101 -3
1110 -2
1111 -1
0000 0
0001 1
0010 2
0011 3

See switchSign.js for further details.

Multiply Two Signed Numbers

This method multiplies two signed integer numbers using bitwise operators. This method is based on the following facts:

a * b can be written in the below formats:
0 if a is zero or b is zero or both a and b are zeroes
2a * (b/2) if b is even
2a * (b - 1)/2 + a if b is odd and positive
2a * (b + 1)/2 - a if b is odd and negative

The advantage of this approach is that in each recursive step one of the operands reduces to half its original value. Hence, the run time complexity is O(log(b)) where b is the operand that reduces to half on each recursive step.

See multiply.js for further details.

Multiply Two Unsigned Numbers

This method multiplies two integer numbers using bitwise operators. This method is based on that "Every number can be denoted as the sum of powers of 2".

The main idea of bitwise multiplication is that every number may be split to the sum of powers of two:

I.e.

19 = 2^4 + 2^1 + 2^0

Then multiplying number x by 19 is equivalent of:

x * 19 = x * 2^4 + x * 2^1 + x * 2^0

Now we need to remember that x * 2^4 is equivalent of shifting x left by 4 bits (x << 4).

See multiplyUnsigned.js for further details.

Count Set Bits

This method counts the number of set bits in a number using bitwise operators. The main idea is that we shift the number right by one bit at a time and check the result of & operation that is 1 if bit is set and 0 otherwise.

Number: 5 = 0b0101
Count of set bits = 2

See countSetBits.js for further details.

Count Bits to Flip One Number to Another

This methods outputs the number of bits required to convert one number to another. This makes use of property that when numbers are XOR-ed the result will be number of different bits.

5 = 0b0101
1 = 0b0001
Count of Bits to be Flipped: 1

See bitsDiff.js for further details.

Count Bits of a Number

To calculate the number of valuable bits we need to shift 1 one bit left each time and see if shifted number is bigger than the input number.

5 = 0b0101
Count of valuable bits is: 3
When we shift 1 four times it will become bigger than 5.

See bitLength.js for further details.

Is Power of Two

This method checks if a number provided is power of two. It uses the following property. Let's say that powerNumber is a number that has been formed as a power of two (i.e. 2, 4, 8, 16 etc.). Then if we'll do & operation between powerNumber and powerNumber - 1 it will return 0 (in case if number is power of two).

Number: 4 = 0b0100
Number: 3 = (4 - 1) = 0b0011
4 & 3 = 0b0100 & 0b0011 = 0b0000 <-- Equal to zero, is power of two.
Number: 10 = 0b01010
Number: 9 = (10 - 1) = 0b01001
10 & 9 = 0b01010 & 0b01001 = 0b01000 <-- Not equal to zero, not a power of two.

See isPowerOfTwo.js for further details.

Full Adder

This method adds up two integer numbers using bitwise operators.

It implements full adder electronics circuit logic to sum two 32-bit integers in two's complement format. It's using the boolean logic to cover all possible cases of adding two input bits: with and without a "carry bit" from adding the previous less-significant stage.

Legend:

  • A: Number A
  • B: Number B
  • ai: ith bit of number A
  • bi: ith bit of number B
  • carryIn: a bit carried in from the previous less-significant stage
  • carryOut: a bit to carry to the next most-significant stage
  • bitSum: The sum of ai, bi, and carryIn
  • resultBin: The full result of adding current stage with all less-significant stages (in binary)
  • resultDec: The full result of adding current stage with all less-significant stages (in decimal)
A = 3: 011
B = 6: 110
┌──────┬────┬────┬─────────┬──────────┬─────────┬───────────┬───────────┐
│ bit │ ai │ bi │ carryIn │ carryOut │ bitSum │ resultBin │ resultDec │
├──────┼────┼────┼─────────┼──────────┼─────────┼───────────┼───────────┤
│ 0 │ 1 │ 0 │ 0 │ 0 │ 1 │ 1 │ 1 │
│ 1 │ 1 │ 1 │ 0 │ 1 │ 0 │ 01 │ 1 │
│ 2 │ 0 │ 1 │ 1 │ 1 │ 0 │ 001 │ 1 │
│ 3 │ 0 │ 0 │ 1 │ 0 │ 1 │ 1001 │ 9 │
└──────┴────┴────┴─────────┴──────────┴─────────┴───────────┴───────────┘

See fullAdder.js for further details.
See Full Adder on YouTube.

References

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Latest commit

History

History

README.md

Bit Manipulation

Get Bit

This method shifts the relevant bit to the zeroth position. Then we perform AND operation with one which has bit pattern like 0001. This clears all bits from the original number except the relevant one. If the relevant bit is one, the result is 1, otherwise the result is 0.

See getBit.js for further details.

Set Bit

This method shifts 1 over by bitPosition bits, creating a value that looks like 00100. Then we perform OR operation that sets specific bit into 1 but it does not affect on other bits of the number.

See setBit.js for further details.

Clear Bit

This method shifts 1 over by bitPosition bits, creating a value that looks like 00100. Than it inverts this mask to get the number that looks like 11011. Then AND operation is being applied to both the number and the mask. That operation unsets the bit.

See clearBit.js for further details.

Update Bit

This method is a combination of "Clear Bit" and "Set Bit" methods.

See updateBit.js for further details.

isEven

This method determines if the number provided is even. It is based on the fact that odd numbers have their last right bit to be set to 1.

Number: 5 = 0b0101
isEven: false
Number: 4 = 0b0100
isEven: true

See isEven.js for further details.

isPositive

This method determines if the number is positive. It is based on the fact that all positive numbers have their leftmost bit to be set to 0. However, if the number provided is zero or negative zero, it should still return false.

Number: 1 = 0b0001
isPositive: true
Number: -1 = -0b0001
isPositive: false

See isPositive.js for further details.

Multiply By Two

This method shifts original number by one bit to the left. Thus all binary number components (powers of two) are being multiplying by two and thus the number itself is being multiplied by two.

Before the shift
Number: 0b0101 = 5
Powers of two: 0 + 2^2 + 0 + 2^0
After the shift
Number: 0b1010 = 10
Powers of two: 2^3 + 0 + 2^1 + 0

See multiplyByTwo.js for further details.

Divide By Two

This method shifts original number by one bit to the right. Thus all binary number components (powers of two) are being divided by two and thus the number itself is being divided by two without remainder.

Before the shift
Number: 0b0101 = 5
Powers of two: 0 + 2^2 + 0 + 2^0
After the shift
Number: 0b0010 = 2
Powers of two: 0 + 0 + 2^1 + 0

See divideByTwo.js for further details.

Switch Sign

This method make positive numbers to be negative and backwards. To do so it uses "Twos Complement" approach which does it by inverting all of the bits of the number and adding 1 to it.

1101 -3
1110 -2
1111 -1
0000 0
0001 1
0010 2
0011 3

See switchSign.js for further details.

Multiply Two Signed Numbers

This method multiplies two signed integer numbers using bitwise operators. This method is based on the following facts:

a * b can be written in the below formats:
0 if a is zero or b is zero or both a and b are zeroes
2a * (b/2) if b is even
2a * (b - 1)/2 + a if b is odd and positive
2a * (b + 1)/2 - a if b is odd and negative

The advantage of this approach is that in each recursive step one of the operands reduces to half its original value. Hence, the run time complexity is O(log(b)) where b is the operand that reduces to half on each recursive step.

See multiply.js for further details.

Multiply Two Unsigned Numbers

This method multiplies two integer numbers using bitwise operators. This method is based on that "Every number can be denoted as the sum of powers of 2".

The main idea of bitwise multiplication is that every number may be split to the sum of powers of two:

I.e.

19 = 2^4 + 2^1 + 2^0

Then multiplying number x by 19 is equivalent of:

x * 19 = x * 2^4 + x * 2^1 + x * 2^0

Now we need to remember that x * 2^4 is equivalent of shifting x left by 4 bits (x << 4).

See multiplyUnsigned.js for further details.

Count Set Bits

This method counts the number of set bits in a number using bitwise operators. The main idea is that we shift the number right by one bit at a time and check the result of & operation that is 1 if bit is set and 0 otherwise.

Number: 5 = 0b0101
Count of set bits = 2

See countSetBits.js for further details.

Count Bits to Flip One Number to Another

This methods outputs the number of bits required to convert one number to another. This makes use of property that when numbers are XOR-ed the result will be number of different bits.

5 = 0b0101
1 = 0b0001
Count of Bits to be Flipped: 1

See bitsDiff.js for further details.

Count Bits of a Number

To calculate the number of valuable bits we need to shift 1 one bit left each time and see if shifted number is bigger than the input number.

5 = 0b0101
Count of valuable bits is: 3
When we shift 1 four times it will become bigger than 5.

See bitLength.js for further details.

Is Power of Two

This method checks if a number provided is power of two. It uses the following property. Let's say that powerNumber is a number that has been formed as a power of two (i.e. 2, 4, 8, 16 etc.). Then if we'll do & operation between powerNumber and powerNumber - 1 it will return 0 (in case if number is power of two).

Number: 4 = 0b0100
Number: 3 = (4 - 1) = 0b0011
4 & 3 = 0b0100 & 0b0011 = 0b0000 <-- Equal to zero, is power of two.
Number: 10 = 0b01010
Number: 9 = (10 - 1) = 0b01001
10 & 9 = 0b01010 & 0b01001 = 0b01000 <-- Not equal to zero, not a power of two.

See isPowerOfTwo.js for further details.

Full Adder

This method adds up two integer numbers using bitwise operators.

It implements full adder electronics circuit logic to sum two 32-bit integers in two's complement format. It's using the boolean logic to cover all possible cases of adding two input bits: with and without a "carry bit" from adding the previous less-significant stage.

Legend:

  • A: Number A
  • B: Number B
  • ai: ith bit of number A
  • bi: ith bit of number B
  • carryIn: a bit carried in from the previous less-significant stage
  • carryOut: a bit to carry to the next most-significant stage
  • bitSum: The sum of ai, bi, and carryIn
  • resultBin: The full result of adding current stage with all less-significant stages (in binary)
  • resultDec: The full result of adding current stage with all less-significant stages (in decimal)
A = 3: 011
B = 6: 110
┌──────┬────┬────┬─────────┬──────────┬─────────┬───────────┬───────────┐
│ bit │ ai │ bi │ carryIn │ carryOut │ bitSum │ resultBin │ resultDec │
├──────┼────┼────┼─────────┼──────────┼─────────┼───────────┼───────────┤
│ 0 │ 1 │ 0 │ 0 │ 0 │ 1 │ 1 │ 1 │
│ 1 │ 1 │ 1 │ 0 │ 1 │ 0 │ 01 │ 1 │
│ 2 │ 0 │ 1 │ 1 │ 1 │ 0 │ 001 │ 1 │
│ 3 │ 0 │ 0 │ 1 │ 0 │ 1 │ 1001 │ 9 │
└──────┴────┴────┴─────────┴──────────┴─────────┴───────────┴───────────┘

See fullAdder.js for further details.
See Full Adder on YouTube.

References