Skip to content

Instantly share code, notes, and snippets.

@Mr00Anderson
Created June 16, 2020 21:22
Show Gist options
  • Select an option

  • Save Mr00Anderson/096cb6fcc6b3d80d5cb45e08f554b40c to your computer and use it in GitHub Desktop.

Select an option

Save Mr00Anderson/096cb6fcc6b3d80d5cb45e08f554b40c to your computer and use it in GitHub Desktop.
helpful for operations
package com.virtual_hex.types;
import java.util.Objects;
/**
* mutable mask only through bitwise operations
*
* Utility for visualizing bit operations
*
* Author: mr00anderson
*
* License: free to use
*
*/
public class BitmaskInt {
public final String name;
public final int mask;
public BitmaskInt(String name, int mask) {
this.name = name;
this.mask = mask;
}
public boolean isBitSet(int number) {
return (number & mask) != 0;
}
public int setBitMask(int number) {
return number | mask;
}
public int unsetBitMask(int number) {
return number & ~mask;
}
private String getBinaryString() {
return getBinaryString(8);
}
private String getBinaryString(int grouping) {
return BitSlotInt.binaryString(mask, grouping);
}
public static boolean hasBitmask(int number, BitmaskInt... masks) {
int length = masks.length;
for (int i = 0; i < length; i++) {
if ((number & masks[i].mask) == 0) {
return false;
}
}
return true;
}
public static int setBitmask(int number, BitmaskInt... masks) {
int length = masks.length;
for (int i = 0; i < length; i++) {
number = number | masks[i].mask;
}
return number;
}
public static int unsetBitmasks(int number, BitmaskInt... masks) {
int length = masks.length;
for (int i = 0; i < length; i++) {
number = number & ~masks[i].mask;
}
return number;
}
@Override
public String toString() {
return "Permission{" +
"name='" + name + '\'' +
", mask=" + mask +
'}';
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof BitmaskInt)) return false;
BitmaskInt that = (BitmaskInt) o;
return mask == that.mask;
}
@Override
public int hashCode() {
return Objects.hash(mask);
}
}
package com.virtual_hex.types;
import java.util.Objects;
/**
* mutable mask only through bitwise operations
*
* Utility for visualizing bit operations
*
* Author: mr00anderson
*
* License: free to use
*
*/
public class BitmaskLong {
public final String name;
public final long mask;
public BitmaskLong(String name, int mask) {
this.name = name;
this.mask = mask;
}
public boolean isBitSet(long number) {
return (number & mask) != 0;
}
public long setBitMask(long number) {
return number | mask;
}
public long unsetBitMask(long number) {
return number & ~mask;
}
private String getBinaryString() {
return getBinaryString(8);
}
private String getBinaryString(int grouping) {
return BitSlotLong.binaryString(mask, grouping);
}
private long clearMask(){
long tempMask = mask;
return tempMask;
}
public static long unsetBitMask(long number, long mask) {
return number & ~mask;
}
@Override
public String toString() {
return "Permission{" +
"name='" + name + '\'' +
", mask=" + mask +
'}';
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof BitmaskInt)) return false;
BitmaskInt that = (BitmaskInt) o;
return mask == that.mask;
}
@Override
public int hashCode() {
return Objects.hash(mask);
}
public static boolean hasBitmask(long number, BitmaskLong... masks) {
int length = masks.length;
for (int i = 0; i < length; i++) {
if ((number & masks[i].mask) == 0) {
return false;
}
}
return true;
}
public static long setBitmask(long number, BitmaskLong... masks) {
int length = masks.length;
for (int i = 0; i < length; i++) {
number = number | masks[i].mask;
}
return number;
}
public static long unsetBitmasks(long number, BitmaskLong... masks) {
int length = masks.length;
for (int i = 0; i < length; i++) {
number = number & ~masks[i].mask;
}
return number;
}
}
package com.virtual_hex.types;
//@formatter:off - IntelliJ
/* @formatter:off - Eclipse */
/**
* Utility for visualizing bit operations
*
* Author: mr00anderson
*
* License: free to use
*/
public enum BitSlotInt {
_0 (0b00000000_00000000_00000000_00000000),
_1 (0b00000000_00000000_00000000_00000001),
_2 (0b00000000_00000000_00000000_00000010),
_3 (0b00000000_00000000_00000000_00000100),
_4 (0b00000000_00000000_00000000_00001000),
_5 (0b00000000_00000000_00000000_00010000),
_6 (0b00000000_00000000_00000000_00100000),
_7 (0b00000000_00000000_00000000_01000000),
_8 (0b00000000_00000000_00000000_10000000),
_9 (0b00000000_00000000_00000001_00000000),
_10 (0b00000000_00000000_00000010_00000000),
_11 (0b00000000_00000000_00000100_00000000),
_12 (0b00000000_00000000_00001000_00000000),
_13 (0b00000000_00000000_00010000_00000000),
_14 (0b00000000_00000000_00100000_00000000),
_15 (0b00000000_00000000_01000000_00000000),
_16 (0b00000000_00000000_10000000_00000000),
_17 (0b00000000_00000001_00000000_00000000),
_18 (0b00000000_00000010_00000000_00000000),
_19 (0b00000000_00000100_00000000_00000000),
_20 (0b00000000_00001000_00000000_00000000),
_21 (0b00000000_00010000_00000000_00000000),
_22 (0b00000000_00100000_00000000_00000000),
_23 (0b00000000_01000000_00000000_00000000),
_24 (0b00000000_10000000_00000000_00000000),
_25 (0b00000001_00000000_00000000_00000000),
_26 (0b00000010_00000000_00000000_00000000),
_27 (0b00000100_00000000_00000000_00000000),
_28 (0b00001000_00000000_00000000_00000000),
_29 (0b00010000_00000000_00000000_00000000),
_30 (0b00100000_00000000_00000000_00000000),
_31 (0b01000000_00000000_00000000_00000000),
_32 (0b10000000_00000000_00000000_00000000);
public final int value;
BitSlotInt(int value) {
this.value = value;
}
public static boolean isBitSet(int number, int mask) {
return (number & mask) != 0;
}
public static int setBitmask(int number, int mask) {
return number | mask;
}
public static int unsetBitMask(int number, BitSlotInt mask) {
return number & ~mask.value;
}
public static int unsetBitMask(int number, int mask) {
return number & ~mask;
}
public static int setBitmaskSlot(int number, BitSlotInt slot, boolean setBit) {
return setBitmaskSlot(number, slot.value, setBit);
}
public static int setBitmaskSlot(int number, int slot, boolean setBit) {
if(setBit){
return number | slot;
} else {
return number & ~slot;
}
}
public static boolean isBitSet(int number, BitSlotInt mask) {
return (number & mask.value) != 0;
}
public static int setBitmask(int number, BitSlotInt mask) {
return number | mask.value;
}
public static String binaryString(int number) {
return binaryString(number, 8);
}
public static String binaryString(int number, int groupSize) {
StringBuilder result = new StringBuilder();
for (int i = 31; i >= 0; i--) {
int mask = 1 << i;
result.append((number & mask) != 0 ? "1" : "0");
if (i % groupSize == 0)
result.append(" ");
}
return result.toString().trim();
}
public static boolean hasBitmask(int number, int... masks) {
int length = masks.length;
for (int i = 0; i < length; i++) {
if ((number & masks[i]) == 0) {
return false;
}
}
return true;
}
public static int setBitmask(int number, int... masks) {
int length = masks.length;
for (int i = 0; i < length; i++) {
number = number | masks[i];
}
return number;
}
public static int unsetBitmasks(int number, int... masks) {
int length = masks.length;
for (int i = 0; i < length; i++) {
number = number & ~masks[i];
}
return number;
}
}
//@formatter:on - IntelliJ
/* @formatter:on - Eclipse */
package com.virtual_hex.types;
//@formatter:off - IntelliJ
/* @formatter:off - Eclipse */
/**
*
* Utility for visualizing bit operations
*
* Author: mr00anderson
*
* License: free to use
*
*/
public enum BitSlotLong {
_0 (0b00000000_00000000_00000000_00000000),
_1 (0b00000000_00000000_00000000_00000001),
_2 (0b00000000_00000000_00000000_00000010),
_3 (0b00000000_00000000_00000000_00000100),
_4 (0b00000000_00000000_00000000_00001000),
_5 (0b00000000_00000000_00000000_00010000),
_6 (0b00000000_00000000_00000000_00100000),
_7 (0b00000000_00000000_00000000_01000000),
_8 (0b00000000_00000000_00000000_10000000),
_9 (0b00000000_00000000_00000001_00000000),
_10 (0b00000000_00000000_00000010_00000000),
_11 (0b00000000_00000000_00000100_00000000),
_12 (0b00000000_00000000_00001000_00000000),
_13 (0b00000000_00000000_00010000_00000000),
_14 (0b00000000_00000000_00100000_00000000),
_15 (0b00000000_00000000_01000000_00000000),
_16 (0b00000000_00000000_10000000_00000000),
_17 (0b00000000_00000001_00000000_00000000),
_18 (0b00000000_00000010_00000000_00000000),
_19 (0b00000000_00000100_00000000_00000000),
_20 (0b00000000_00001000_00000000_00000000),
_21 (0b00000000_00010000_00000000_00000000),
_22 (0b00000000_00100000_00000000_00000000),
_23 (0b00000000_01000000_00000000_00000000),
_24 (0b00000000_10000000_00000000_00000000),
_25 (0b00000001_00000000_00000000_00000000),
_26 (0b00000010_00000000_00000000_00000000),
_27 (0b00000100_00000000_00000000_00000000),
_28 (0b00001000_00000000_00000000_00000000),
_29 (0b00010000_00000000_00000000_00000000),
_30 (0b00100000_00000000_00000000_00000000),
_31 (0b01000000_00000000_00000000_00000000),
_32 (0b10000000_00000000_00000000_00000000),
_33 (0b00000000_00000000_00000000_00000001_00000000_00000000_00000000_00000000L),
_34 (0b00000000_00000000_00000000_00000010_00000000_00000000_00000000_00000000L),
_35 (0b00000000_00000000_00000000_00000100_00000000_00000000_00000000_00000000L),
_36 (0b00000000_00000000_00000000_00001000_00000000_00000000_00000000_00000000L),
_37 (0b00000000_00000000_00000000_00010000_00000000_00000000_00000000_00000000L),
_38 (0b00000000_00000000_00000000_00100000_00000000_00000000_00000000_00000000L),
_39 (0b00000000_00000000_00000000_01000000_00000000_00000000_00000000_00000000L),
_40 (0b00000000_00000000_00000000_10000000_00000000_00000000_00000000_00000000L),
_41 (0b00000000_00000000_00000001_00000000_00000000_00000000_00000000_00000000L),
_42 (0b00000000_00000000_00000010_00000000_00000000_00000000_00000000_00000000L),
_43 (0b00000000_00000000_00000100_00000000_00000000_00000000_00000000_00000000L),
_44 (0b00000000_00000000_00001000_00000000_00000000_00000000_00000000_00000000L),
_45 (0b00000000_00000000_00010000_00000000_00000000_00000000_00000000_00000000L),
_46 (0b00000000_00000000_00100000_00000000_00000000_00000000_00000000_00000000L),
_47 (0b00000000_00000000_01000000_00000000_00000000_00000000_00000000_00000000L),
_48 (0b00000000_00000000_10000000_00000000_00000000_00000000_00000000_00000000L),
_49 (0b00000000_00000001_00000000_00000000_00000000_00000000_00000000_00000000L),
_50 (0b00000000_00000010_00000000_00000000_00000000_00000000_00000000_00000000L),
_51 (0b00000000_00000100_00000000_00000000_00000000_00000000_00000000_00000000L),
_52 (0b00000000_00001000_00000000_00000000_00000000_00000000_00000000_00000000L),
_53 (0b00000000_00010000_00000000_00000000_00000000_00000000_00000000_00000000L),
_54 (0b00000000_00100000_00000000_00000000_00000000_00000000_00000000_00000000L),
_55 (0b00000000_01000000_00000000_00000000_00000000_00000000_00000000_00000000L),
_56 (0b00000000_10000000_00000000_00000000_00000000_00000000_00000000_00000000L),
_57 (0b00000001_00000000_00000000_00000000_00000000_00000000_00000000_00000000L),
_58 (0b00000010_00000000_00000000_00000000_00000000_00000000_00000000_00000000L),
_59 (0b00000100_00000000_00000000_00000000_00000000_00000000_00000000_00000000L),
_60 (0b00001000_00000000_00000000_00000000_00000000_00000000_00000000_00000000L),
_61 (0b00010000_00000000_00000000_00000000_00000000_00000000_00000000_00000000L),
_62 (0b00100000_00000000_00000000_00000000_00000000_00000000_00000000_00000000L),
_63 (0b01000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000L),
_64 (0b10000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000L);
public final long value;
BitSlotLong(long value) {
this.value = value;
}
public static boolean isBitSet(long number, long mask) {
return (number & mask) != 0;
}
public static long setBitmask(long number, long mask) {
return number | mask;
}
public static boolean isBitSet(long number, BitSlotLong mask) {
return (number & mask.value) != 0;
}
public static long setBitmaskSlot(long number, BitSlotLong slot, boolean setBit) {
return setBitmaskSlot(number, slot.value, setBit);
}
public static long setBitmaskSlot(long number, long slot, boolean setBit) {
if(setBit){
return number | slot;
} else {
return number & ~slot;
}
}
public static long unsetBitMask(long number, BitSlotLong mask) {
return number & ~mask.value;
}
public static long setBitmask(long number, BitSlotLong mask) {
return number | mask.value;
}
public static String binaryString(long number) {
return binaryString(number, 8);
}
public static String binaryString(long number, int groupSize) {
StringBuilder result = new StringBuilder();
for (int i = 31; i >= 0; i--) {
int mask = 1 << i;
result.append((number & mask) != 0 ? "1" : "0");
if (i % groupSize == 0)
result.append(" ");
}
return result.toString().trim();
}
public static boolean hasBitmask(long number, long... masks) {
int length = masks.length;
for (int i = 0; i < length; i++) {
if ((number & masks[i]) == 0) {
return false;
}
}
return true;
}
public static long setBitmask(long number, long... masks) {
int length = masks.length;
for (int i = 0; i < length; i++) {
number = number | masks[i];
}
return number;
}
public static long unsetBitmasks(long number, long... masks) {
int length = masks.length;
for (int i = 0; i < length; i++) {
number = number & ~masks[i];
}
return number;
}
}
//@formatter:on - IntelliJ
/* @formatter:on - Eclipse */
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment