2012-04-25 4 views
3

shifters ...Comment vérifier si bit est défini dans Hex-String?

Je dois faire quelque chose qui me détraque.

Je reçois une valeur hexadécimale en tant que chaîne (par exemple: "AFFE") et je dois décider si le bit 5 de l'octet un est activé.

public boolean isBitSet(String hexValue) { 
    //enter your code here 
    return "no idea".equals("no idea") 
} 

Des indices?

Cordialement,

Boskop

Répondre

7

La façon la plus simple est de convertir String à int, et l'arithmétique binaire utilisation:

public boolean isBitSet(String hexValue, int bitNumber) { 
    int val = Integer.valueOf(hexValue, 16); 
    return (val & (1 << bitNumber)) != 0; 
}    ^ ^--- int value with only the target bit set to one 
       |--------- bit-wise "AND" 
0

Comment cela? Ensuite, vous pouvez examiner la chaîne pour vérifier les bits particuliers qui vous intéressent.

1

En supposant que l'octet un est représenté par les deux derniers chiffres, et la taille de la chaîne fixée à 4 caractères, alors la réponse peut être:

return (int)hexValue[2] & 1 == 1; 

Comme vous voyez un, vous n'avez pas besoin pour convertir toute la chaîne en binaire pour évaluer le 5ème bit, c'est bien le LSB du 3ème caractère.

Maintenant, si la taille de la chaîne hexagonale est variable, alors vous aurez besoin de quelque chose comme:

return (int)hexValue[hexValue.Length-2] & 1 == 1; 

Mais comme la chaîne peut avoir une longueur inférieure à 2, il serait plus sûr:

return hexValue.Length < 2 ? 0 : (int)hexValue[hexValue.Length-2] & 1 == 1; 

la réponse peut varier en fonction de ce que vous considérez comme octet 1 et le bit 5.

0

Utilisez le BigInteger et il est TESTBIT fonction intégrée

static public boolean getBit(String hex, int bit) { 
    BigInteger bigInteger = new BigInteger(hex, 16); 
    return bigInteger.testBit(bit); 
} 
Questions connexes