File tree 10 files changed +152
-0
lines changed
10 files changed +152
-0
lines changed Original file line number Diff line number Diff line change @@ -49,6 +49,7 @@ a set of rules that precisely define a sequence of operations.
49
49
### Algorithms by Topic
50
50
51
51
* ** Math**
52
+ * ` B ` [ Bit Manipulation] ( src/algorithms/math/bits ) - set/get/update/clear bits
52
53
* ` B ` [ Factorial] ( src/algorithms/math/factorial )
53
54
* ` B ` [ Fibonacci Number] ( src/algorithms/math/fibonacci )
54
55
* ` B ` [ Primality Test] ( src/algorithms/math/primality-test ) (trial division method)
Original file line number Diff line number Diff line change
1
+ # Bit Manipulation
2
+
3
+ #### Get Bit
4
+
5
+ This method shifts ` 1 ` over by ` bitPosition ` bits, creating a
6
+ value that looks like ` 00100 ` . Then we perform ` AND ` operation
7
+ that clears all bits from the original number except the
8
+ ` bitPosition ` one. Then we compare the result with zero. If
9
+ result is zero that would mean that original number has ` 0 ` at
10
+ position ` bitPosition ` .
11
+
12
+ > See ` getBit ` function for further details.
13
+
14
+ #### Set Bit
15
+
16
+ This method shifts ` 1 ` over by ` bitPosition ` bits, creating a
17
+ value that looks like ` 00100 ` . Then we perform ` OR ` operation
18
+ that sets specific bit into ` 1 ` but it does not affect on
19
+ other bits of the number.
20
+
21
+ > See ` setBit ` function for further details.
22
+
23
+ #### Clear Bit
24
+
25
+ This method shifts ` 1 ` over by ` bitPosition ` bits, creating a
26
+ value that looks like ` 00100 ` . Than it inverts this mask to get
27
+ the number that looks like ` 11011 ` . Then ` AND ` operation is
28
+ being applied to both the number and the mask. That operation
29
+ unsets the bit.
30
+
31
+ > See ` clearBit ` function for further details.
32
+
33
+ #### Update Bit
34
+
35
+ This method is a combination of "Clear Bit" and "Set Bit" methods.
36
+
37
+ > See ` updateBit ` function for further details.
Original file line number Diff line number Diff line change
1
+ import clearBit from '../clearBit' ;
2
+
3
+ describe ( 'clearBit' , ( ) => {
4
+ it ( 'should clear bit at specific position' , ( ) => {
5
+ // 1 = 0b0001
6
+ expect ( clearBit ( 1 , 0 ) ) . toBe ( 0 ) ;
7
+ expect ( clearBit ( 1 , 1 ) ) . toBe ( 1 ) ;
8
+ expect ( clearBit ( 1 , 2 ) ) . toBe ( 1 ) ;
9
+
10
+ // 10 = 0b1010
11
+ expect ( clearBit ( 10 , 0 ) ) . toBe ( 10 ) ;
12
+ expect ( clearBit ( 10 , 1 ) ) . toBe ( 8 ) ;
13
+ expect ( clearBit ( 10 , 3 ) ) . toBe ( 2 ) ;
14
+ } ) ;
15
+ } ) ;
Original file line number Diff line number Diff line change
1
+ import getBit from '../getBit' ;
2
+
3
+ describe ( 'getBit' , ( ) => {
4
+ it ( 'should get bit at specific position' , ( ) => {
5
+ // 1 = 0b0001
6
+ expect ( getBit ( 1 , 0 ) ) . toBe ( 1 ) ;
7
+ expect ( getBit ( 1 , 1 ) ) . toBe ( 0 ) ;
8
+
9
+ // 2 = 0b0010
10
+ expect ( getBit ( 2 , 0 ) ) . toBe ( 0 ) ;
11
+ expect ( getBit ( 2 , 1 ) ) . toBe ( 1 ) ;
12
+
13
+ // 3 = 0b0011
14
+ expect ( getBit ( 3 , 0 ) ) . toBe ( 1 ) ;
15
+ expect ( getBit ( 3 , 1 ) ) . toBe ( 1 ) ;
16
+
17
+ // 10 = 0b1010
18
+ expect ( getBit ( 10 , 0 ) ) . toBe ( 0 ) ;
19
+ expect ( getBit ( 10 , 1 ) ) . toBe ( 1 ) ;
20
+ expect ( getBit ( 10 , 2 ) ) . toBe ( 0 ) ;
21
+ expect ( getBit ( 10 , 3 ) ) . toBe ( 1 ) ;
22
+ } ) ;
23
+ } ) ;
Original file line number Diff line number Diff line change
1
+ import setBit from '../setBit' ;
2
+
3
+ describe ( 'setBit' , ( ) => {
4
+ it ( 'should set bit at specific position' , ( ) => {
5
+ // 1 = 0b0001
6
+ expect ( setBit ( 1 , 0 ) ) . toBe ( 1 ) ;
7
+ expect ( setBit ( 1 , 1 ) ) . toBe ( 3 ) ;
8
+ expect ( setBit ( 1 , 2 ) ) . toBe ( 5 ) ;
9
+
10
+ // 10 = 0b1010
11
+ expect ( setBit ( 10 , 0 ) ) . toBe ( 11 ) ;
12
+ expect ( setBit ( 10 , 1 ) ) . toBe ( 10 ) ;
13
+ expect ( setBit ( 10 , 2 ) ) . toBe ( 14 ) ;
14
+ } ) ;
15
+ } ) ;
Original file line number Diff line number Diff line change
1
+ import updateBit from '../updateBit' ;
2
+
3
+ describe ( 'updateBit' , ( ) => {
4
+ it ( 'should update bit at specific position' , ( ) => {
5
+ // 1 = 0b0001
6
+ expect ( updateBit ( 1 , 0 , 1 ) ) . toBe ( 1 ) ;
7
+ expect ( updateBit ( 1 , 0 , 0 ) ) . toBe ( 0 ) ;
8
+ expect ( updateBit ( 1 , 1 , 1 ) ) . toBe ( 3 ) ;
9
+ expect ( updateBit ( 1 , 2 , 1 ) ) . toBe ( 5 ) ;
10
+
11
+ // 10 = 0b1010
12
+ expect ( updateBit ( 10 , 0 , 1 ) ) . toBe ( 11 ) ;
13
+ expect ( updateBit ( 10 , 0 , 0 ) ) . toBe ( 10 ) ;
14
+ expect ( updateBit ( 10 , 1 , 1 ) ) . toBe ( 10 ) ;
15
+ expect ( updateBit ( 10 , 1 , 0 ) ) . toBe ( 8 ) ;
16
+ expect ( updateBit ( 10 , 2 , 1 ) ) . toBe ( 14 ) ;
17
+ expect ( updateBit ( 10 , 2 , 0 ) ) . toBe ( 10 ) ;
18
+ } ) ;
19
+ } ) ;
Original file line number Diff line number Diff line change
1
+ /**
2
+ * @param {number } number
3
+ * @param {number } bitPosition - zero based.
4
+ * @return {number }
5
+ */
6
+ export default function clearBit ( number , bitPosition ) {
7
+ const mask = ~ ( 1 << bitPosition ) ;
8
+
9
+ return number & mask ;
10
+ }
Original file line number Diff line number Diff line change
1
+ /**
2
+ * @param {number } number
3
+ * @param {number } bitPosition - zero based.
4
+ * @return {number }
5
+ */
6
+ export default function getBit ( number , bitPosition ) {
7
+ return ( number & ( 1 << bitPosition ) ) === 0 ? 0 : 1 ;
8
+ }
Original file line number Diff line number Diff line change
1
+ /**
2
+ * @param {number } number
3
+ * @param {number } bitPosition - zero based.
4
+ * @return {number }
5
+ */
6
+ export default function setBit ( number , bitPosition ) {
7
+ return number | ( 1 << bitPosition ) ;
8
+ }
Original file line number Diff line number Diff line change
1
+ /**
2
+ * @param {number } number
3
+ * @param {number } bitPosition - zero based.
4
+ * @param {number } bitValue - 0 or 1.
5
+ * @return {number }
6
+ */
7
+ export default function updateBit ( number , bitPosition , bitValue ) {
8
+ // Normalized bit value.
9
+ const bitValueNormalized = bitValue ? 1 : 0 ;
10
+
11
+ // Init clear mask.
12
+ const clearMask = ~ ( 1 << bitPosition ) ;
13
+
14
+ // Cleat bit value and then set it up to required value.
15
+ return ( number & clearMask ) | ( bitValueNormalized << bitPosition ) ;
16
+ }
You can’t perform that action at this time.
0 commit comments