Простой способ сделать это для больших шестнадцатеричных чисел заключается в следующем:
import java.math.BigInteger;
public class Main {
public static void main(String[] args) {
String hex = "AAE04471";
System.out.println("Hexadecimal string: " + hex);
BigInteger bigInt = new BigInteger(hex, 16);
String binary = bigInt.toString(2);
System.out.println("Binary string: " + binary);
System.out.println("\nBit information:");
System.out.println("32nd bit is " + (binary.charAt(binary.length() - 32) == '1' ? true : false));
System.out.println("31st bit is " + (binary.charAt(binary.length() - 31) == '1' ? true : false));
System.out.println("30th bit is " + (binary.charAt(binary.length() - 30) == '1' ? true : false));
// Alternatively,
System.out.println("\nBit information using an alternative method:");
System.out.println("32nd bit is " + bigInt.testBit(31));
System.out.println("31st bit is " + bigInt.testBit(30));
System.out.println("30th bit is " + bigInt.testBit(29));
}
}
Вывод:
Hexadecimal string: AAE04471
Binary string: 10101010111000000100010001110001
Bit information:
32nd bit is true
31st bit is false
30th bit is true
Bit information using an alternative method:
32nd bit is true
31st bit is false
30th bit is true
[ Обновление]
Теперь я разработал способ, который будет работать для шестнадцатеричного числа любой длины. Ниже приведено решение вместе с парой тестов:
public class Main {
public static void main(String[] args) {
String hex = "AAE04471";
String binary = hexadecimalToBinary(hex);
System.out.println("Hexadecimal: " + hex);
System.out.println("Binary: " + binary);
System.out.println("Is bit number 32 set: " + isBitSet(binary, 32));
System.out.println("Is bit number 31 set: " + isBitSet(binary, 31));
System.out.println("Is bit number 30 set: " + isBitSet(binary, 30));
System.out.println("---------------------------------------------");
hex = "AAE044710C0000000000000000FF0000";
binary = hexadecimalToBinary(hex);
System.out.println("Hexadecimal: " + hex);
System.out.println("Binary: " + binary);
System.out.println("Is bit number 32 set: " + isBitSet(binary, 32));
System.out.println("Is bit number 31 set: " + isBitSet(binary, 31));
System.out.println("Is bit number 30 set: " + isBitSet(binary, 30));
}
static String hexadecimalToBinary(String hexadecimal) {
String binary = hexadecimal;
String[] hexDigits = { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F" };
String[] hextoBinaryDigits = { "0000", "0001", "0010", "0011", "0100", "0101", "0110", "0111", "1000", "1001",
"1010", "1011", "1100", "1101", "1110", "1111" };
for (int i = 0; i < hexDigits.length; i++)
binary = binary.replaceAll(hexDigits[i], hextoBinaryDigits[i]);
return binary;
}
static boolean isBitSet(String binary, int bitNumber) {
if (bitNumber > binary.length()) {
return false;
}
return binary.charAt(binary.length() - bitNumber) == '1' ? true : false;
}
}
Вывод:
Hexadecimal: AAE04471
Binary: 10101010111000000100010001110001
Is bit number 32 set: true
Is bit number 31 set: false
Is bit number 30 set: true
---------------------------------------------
Hexadecimal: AAE044710C0000000000000000FF0000
Binary: 10101010111000000100010001110001000011000000000000000000000000000000000000000000000000000000000000000000111111110000000000000000
Is bit number 32 set: false
Is bit number 31 set: false
Is bit number 30 set: false
[2-е обновление]
Наконец, я разработал способ, который будет работать для шестнадцатеричного числа любой длины, и это тоже, без преобразования всего шестнадцатеричного числа в двоичное число. Скорее, этот метод преобразует только одну шестнадцатеричную ди git (шестнадцатеричная ди git, где находится номер бита, статус которого должен быть найден) в двоичную строку. Ниже приведено решение вместе с парой тестов:
public class Main {
public static void main(String[] args) {
String hex = "AAE04471";
System.out.println("Hexadecimal: " + hex);
System.out.println("Is bit number 32 set: " + isBitSet(hex, 32));
System.out.println("Is bit number 31 set: " + isBitSet(hex, 31));
System.out.println("Is bit number 30 set: " + isBitSet(hex, 30));
System.out.println("----------------------");
hex = "AAE044710C0000000000000000FF0000";
System.out.println("Hexadecimal: " + hex);
System.out.println("Is bit number 32 set: " + isBitSet(hex, 32));
System.out.println("Is bit number 31 set: " + isBitSet(hex, 31));
System.out.println("Is bit number 30 set: " + isBitSet(hex, 30));
}
static boolean isBitSet(String hex, int bitNumber) {
if (bitNumber > hex.length() * 4) {
return false;
}
int i = bitNumber % 4 == 0 ? bitNumber / 4 : bitNumber / 4 + 1;
// Get the hexadecimal digit where lies the bit number whose status is to be
// found.
StringBuilder sb = new StringBuilder().append(hex.charAt(hex.length() - i));
// Get the decimal equivalent of the hexadecimal digit
int n = Integer.parseInt(sb.toString(), 16);
// Convert the binary equivalent of the hexadecimal digit into 4-digit string by
// left-padding 0
String binaryStringIn4Digits = String.format("%1$" + 4 + "s", Integer.toBinaryString(n)).replace(' ', '0');
return binaryStringIn4Digits.charAt(3 - bitNumber % 4) == '1' ? true : false;
}
}
Вывод:
Hexadecimal: AAE04471
Is bit number 32 set: false
Is bit number 31 set: true
Is bit number 30 set: false
----------------------
Hexadecimal: AAE044710C0000000000000000FF0000
Is bit number 32 set: false
Is bit number 31 set: false
Is bit number 30 set: false
Надеюсь, все эти различные виды решений помогут вам решить вашу проблему.