Javaと "

lshiftLeft、width = 401、height = 218

`&0xFF`が何であるかを理解する前に、以下のものを知っていることを確認してください:

  1. ビット単位のAND演算子、

  1. バイナリに16進数を変換し、バイナリに10進数を変換します.

つまり、

IPアドレスを10進数に/10進数に変換する例を見てみましょう。

1. IPアドレスを10進数に変換する

IpAddressを10進数に変換し、より正確な計算と比較のためにデータベースに格納するのが一般的な方法です。

Testing IP address = 192.168.1.2
Decimal Number     = 3232235778

`192.168.1.2`を10進数(基数10)に変換するには、次のようになります。

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

P.S標準IPは「base 256」、http://help.network-tools.com/convert-base-10-to-ip/[source].

2. IPアドレスに10進数を変換する

10進数をIPアドレスに変換するには、ビットシフト演算子を使用し、 mask 'に

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

出力

11000000101010000000000100000010
192
168
1
2

質問はなぜ `(ipAddress >> 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(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

`

さて、あなたは `

  • 2.3(ipAddress >> 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(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. Javaソースコード

上記のシナリオを示す完全なJavaの例

BitwiseExample.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/java-convert-ip-address-to-decimal-number/[Java - Convert

"

: Calculate whether an ip is in a specified range in java]. http://en.wikipedia.org/wiki/Two%27s__complement [Wikipedia : Two’s

IPアドレッシング]