BAEL-4814 Bitmasking in Java with Bitwise Operators (#11069)
This commit is contained in:
parent
dd50f5e80b
commit
54f85ac6cd
|
@ -0,0 +1,120 @@
|
||||||
|
package com.baeldung.oroperators;
|
||||||
|
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import java.util.Arrays;
|
||||||
|
|
||||||
|
import static org.junit.Assert.*;
|
||||||
|
|
||||||
|
public class BitmaskingUnitTest {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenIntegerShouldPrintBinaryRepresentation() {
|
||||||
|
// given
|
||||||
|
int intRepresentation = 1094795523;
|
||||||
|
|
||||||
|
// expected
|
||||||
|
String stringRepresentation = getStringRepresentation(intRepresentation);
|
||||||
|
assertEquals(stringRepresentation, "01000001010000010100000100000011");
|
||||||
|
}
|
||||||
|
|
||||||
|
private String getStringRepresentation(int intRepresentation) {
|
||||||
|
String binaryString = Integer.toBinaryString(intRepresentation);
|
||||||
|
return padWithZeros(binaryString);
|
||||||
|
}
|
||||||
|
|
||||||
|
private String padWithZeros(String binaryString) {
|
||||||
|
return String.format("%" + 32 + "s", binaryString).replace(' ', '0');
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenBinaryRepresentationShouldReturnNumber() {
|
||||||
|
// given
|
||||||
|
String stringRepresentation = "01000001010000010100000100000011";
|
||||||
|
|
||||||
|
// expected
|
||||||
|
int intRepresentation = Integer.parseUnsignedInt(stringRepresentation, 2);
|
||||||
|
assertEquals(intRepresentation, 1094795523);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenBinaryRepresentationShouldReturnCharacter() {
|
||||||
|
// given
|
||||||
|
String stringRepresentation = "010000010100000101000001";
|
||||||
|
|
||||||
|
// expected
|
||||||
|
assertEquals(binaryToText(stringRepresentation), "AAA");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenIntAndPositionNumberShouldReturnBitValue() {
|
||||||
|
// given
|
||||||
|
String stringRepresentation = "010000010100000101000001000000011";
|
||||||
|
int intRepresentation = Integer.parseUnsignedInt(stringRepresentation, 2);
|
||||||
|
|
||||||
|
// when
|
||||||
|
boolean value1 = extractValueAtPosition(intRepresentation, 1);
|
||||||
|
boolean value2 = extractValueAtPosition(intRepresentation, 2);
|
||||||
|
boolean value3 = extractValueAtPosition(intRepresentation, 3);
|
||||||
|
|
||||||
|
// then
|
||||||
|
assertTrue(value1);
|
||||||
|
assertTrue(value2);
|
||||||
|
assertFalse(value3);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenIntegerShouldExtractLastThreeBytes() {
|
||||||
|
// given
|
||||||
|
int intRepresentation = 1094795523;
|
||||||
|
|
||||||
|
// when
|
||||||
|
int lastThreeBites = intRepresentation >> 8;
|
||||||
|
|
||||||
|
// expected
|
||||||
|
String stringRepresentation = getStringRepresentation(lastThreeBites);
|
||||||
|
assertEquals(stringRepresentation, "00000000010000010100000101000001");
|
||||||
|
assertEquals(binaryToText(stringRepresentation), "AAA");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenIntegerShouldApplyMask() {
|
||||||
|
// given
|
||||||
|
int intRepresentation = Integer.parseUnsignedInt("00000000010000010100000101000001", 2);
|
||||||
|
int mask = Integer.parseUnsignedInt("00000000000000000000000000000011", 2);
|
||||||
|
int mask2 = Integer.parseUnsignedInt("00000000000000000000000000000001", 2);
|
||||||
|
|
||||||
|
// when
|
||||||
|
int masked = intRepresentation & mask;
|
||||||
|
int masked2 = intRepresentation & mask2;
|
||||||
|
|
||||||
|
// expected
|
||||||
|
assertEquals(getStringRepresentation(masked), "00000000000000000000000000000001");
|
||||||
|
assertEquals(getStringRepresentation(masked2), "00000000000000000000000000000001");
|
||||||
|
assertNotEquals(masked, mask);
|
||||||
|
assertEquals(masked2, mask2);
|
||||||
|
assertFalse((intRepresentation & mask) == mask);
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean extractValueAtPosition(int intRepresentation, int position) {
|
||||||
|
String mask = getStringRepresentation(1 << (position - 1));
|
||||||
|
System.out.println(getStringRepresentation(intRepresentation));
|
||||||
|
System.out.println(mask);
|
||||||
|
System.out.println("-------------------------------- &");
|
||||||
|
System.out.println(getStringRepresentation((intRepresentation) & (1 << (position - 1))));
|
||||||
|
System.out.println();
|
||||||
|
return ((intRepresentation) & (1 << (position - 1))) != 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static String binaryToText(String stringRepresentation) {
|
||||||
|
return Arrays.stream(stringRepresentation.split("(?<=\\G.{8})"))
|
||||||
|
.filter(eightBits -> !eightBits.equals("00000000"))
|
||||||
|
.map(eightBits -> (char)Integer.parseInt(eightBits, 2))
|
||||||
|
.collect(
|
||||||
|
StringBuilder::new,
|
||||||
|
StringBuilder::append,
|
||||||
|
StringBuilder::append
|
||||||
|
).toString();
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue