Exemple Java et «& 0xFF»
Avant de comprendre ce qu'est& 0xFF
, assurez-vous de connaître les éléments suivants:
-
Opérateur AND au niveau du bit,link.
-
Convertit hex en / de binaire et décimal en / de binaire.
En bref,& 0xFF
est utilisé pour s'assurer que vous obtenez toujours les 8 derniers bits. Voyons un exemple pour convertir une adresse IP en / à partir d'un nombre décimal.
1. Convertir l'adresse IP en décimal
Il est courant de convertir IpAddress en décimal et de le stocker dans la base de données pour de meilleurs calculs et comparaisons.
Testing IP address = 192.168.1.2 Decimal Number = 3232235778
Pour convertir192.168.1.2
en décimal (base 10), la formule est:
192 x (256)^3 + 168 x (256)^2 + 1 x (256)^1 + 2 (256)^0 = ? 3221225472 + 11010048 + 256 + 2 = 3232235778
P.S A standard IP is “base 256”, source.
2. Convertir décimal en adresse IP, avec & 0xFF
Pour reconvertir la décimale en adresse IP, nous utilisons l'opérateur de décalage de bits et le «masquons» avec& 0xff
.
Code Java
long ipAddress = 3232235778L; String binary = Long.toBinaryString(ipAddress); System.out.println(binary); System.out.println((ipAddress>>24) & 0xFF); System.out.println((ipAddress>>16) & 0xFF); System.out.println((ipAddress>>8) & 0xFF); System.out.println((ipAddress) & 0xFF);
Sortie
11000000101010000000000100000010 192 168 1 2
La question est pourquoi(ipAddress>>24) & 0xFF
retournera 192? Plongez dans la théorie du décalage binaire binaire ci-dessous:
2.1 (ipAddress>>24) & 0xFF = 192
Decimal = 3232235778 Binary = 11000000 10101000 00000001 00000010 IpAddress = 192 168 1 2 (ipAddress>>24) -------------------------->24 Binary = 00000000 00000000 00000000 11000000 (ipAddress>>24) & 0xFF Binary = 00000000 00000000 00000000 11000000 & 0xFF = 00000000 00000000 00000000 11111111 Result = 00000000 00000000 00000000 11000000 = 192 (2^7 + 2^6)
Dans ce cas, le 0xFF est facultatif.
2.2 (ipAddress>>16) & 0xFF = 168
Decimal = 3232235778 Binary = 11000000 10101000 00000001 00000010 (ipAddress>>16) ----------------->16 Binary = 00000000 00000000 11000000 10101000 (ipAddress>>16) & 0xFF Binary = 00000000 00000000 11000000 10101000 = 49320 (2^14 + 2^15 + 2^7 + 2^5 + 2^3) & 0xFF = 00000000 00000000 00000000 11111111 Result = 00000000 00000000 00000000 10101000 = 168
Avant& 0xFF
, vous obtenez 49320, après& 0xFF
, vous obtenez les 168 corrects. Maintenant, vous devez comprendre l'utilisation de& 0xFF
, cela garantit simplement que vous obtenez toujours les 8 derniers bits.
2.3 (ipAddress>>8) & 0xFF = 1
Decimal = 3232235778 Binary = 11000000 10101000 00000001 00000010 (ipAddress>>8) -------->8 Binary = 00000000 11000000 10101000 00000001 (ipAddress>>8) & 0xFF Binary = 00000000 11000000 10101000 00000001 = 12625921 & 0xFF = 00000000 00000000 00000000 11111111 Result = 00000000 00000000 00000000 00000001 = 1
2.4 (ipAddress) & 0xFF = 2
Decimal = 3232235778 Binary = 11000000 10101000 00000001 00000010 (ipAddress) Binary = 11000000 10101000 00000001 00000010 (ipAddress) & 0xFF Binary = 11000000 10101000 00000001 00000010 = 3232235778 & 0xFF = 00000000 00000000 00000000 11111111 Result = 00000000 00000000 00000000 00000010 = 2
3. Code source Java
Exemple Java complet pour illustrer le scénario ci-dessus.
BitwiseExample.java
package com.example.core; public class BitwiseExample { public static void main(String[] args) { BitwiseExample obj = new BitwiseExample(); long ipAddressInLong = obj.ipToLong("192.168.1.2"); System.out.println(ipAddressInLong); String binary = Long.toBinaryString(ipAddressInLong); printPrettyBinary(binary); String ipAddressInString = obj.longToIp(ipAddressInLong); System.out.println(ipAddressInString); } public long ipToLong(String ipAddress) { String[] addrArray = ipAddress.split("\\."); long num = 0; for (int i = 0; i < addrArray.length; i++) { int power = 3 - i; // 1. (192 % 256) * 256 pow 3 // 2. (168 % 256) * 256 pow 2 // 3. (2 % 256) * 256 pow 1 // 4. (1 % 256) * 256 pow 0 num += ((Integer.parseInt(addrArray[i]) % 256 * Math.pow(256, power))); } return num; } public String longToIp(long i) { return ((i >> 24) & 0xFF) + "." + ((i >> 16) & 0xFF) + "." + ((i >> 8) & 0xFF) + "." + (i & 0xFF); } //print pretty binary code, padding left zero private static void printPrettyBinary(String binary) { String s1 = String.format("%32s", binary).replace(' ', '0'); System.out.format("%8s %8s %8s %8s %n", s1.substring(0, 8), s1.substring(8, 16), s1.substring(16, 24), s1.substring(24, 32)); } }
Sortie
3232235778 11000000 10101000 00000001 00000010 192.168.1.2