Рубрики
Без рубрики

Java и “&0xFF” пример

– Java и пример “&0xFF”

Прежде чем вы поймете, что такое & 0xFF , убедитесь, что вы знаете следующие материалы:

  1. Побитовый оператор И, ссылка .
  2. Преобразует шестнадцатеричный код в/из двоичного и десятичный в/из двоичного.

Короче говоря, & 0xFF используется, чтобы убедиться, что вы всегда получаете последние 8 бит. Давайте рассмотрим пример преобразования IP-адреса в/из десятичного числа.

1. Преобразование IP-адреса До Десятичной

Это обычная практика, чтобы преобразовать Ip-адрес в десятичный и сохранить его в базе данных для лучшего расчета и сравнения.

Testing IP address = 192.168.1.2
Decimal Number     = 3232235778

Для преобразования 192.168.1.2 для десятичной дроби (основание 10) формула имеет вид:

192 x (256)^3 + 168 x (256)^2 + 1 x (256)^1 + 2 (256)^0 = ?
3221225472 + 11010048 + 256 + 2 = 3232235778

P.S Стандартный IP-адрес – “база 256”., источник .

2. Преобразуйте десятичную дробь в IP-адрес с помощью &0xFF

Чтобы преобразовать десятичное число обратно в IP-адрес, мы используем оператор сдвига битов и “маскируем” его с помощью & 0xff .

  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);

Выход

11000000101010000000000100000010
192
168
1
2

Вопрос в том, почему (IP-адрес>>24) & 0xFF вернет 192? Давайте погрузимся в теорию сдвига двоичных битов ниже:

2.1 (ip-адрес>>24) &

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)

В этом случае 0xFF является необязательным.

2.2 (ip-адрес>>16) &

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

До & 0xFF вы получаете 49320, после & 0xFF вы получаете правильные 168. Теперь вы должны понимать использование & 0xFF , это просто гарантирует, что вы всегда получите последние 8 бит.

2.3 (ip-адрес>>8) &

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 (ip-адрес) &

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. Исходный код Java

Полный пример Java для демонстрации описанного выше сценария.

package com.mkyong.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));
  }

}

Выход

3232235778
11000000 10101000 00000001 00000010 
192.168.1.2

Фото Кредит: Фото Кредит:

Рекомендации

  1. Java – Преобразование IP-адреса в десятичный пример
  2. Что делает “&0xFF”?
  3. Stackoverflow: Руководство для начинающих по сдвигу битов?
  4. Stackoverflow: Вычислите, находится ли ip-адрес в указанном диапазоне в java
  5. Википедия: Дополнение двоих
  6. Википедия: Побитовая операция
  7. Преобразование базы 10 в ip
  8. Корпорация Майкрософт: IP Адресация

Оригинал: “https://mkyong.com/java/java-and-0xff-example/”