【问题描述】
一个IP地址由32位二进制的数组成,比如:
111111111111111111111111000000002
为了便于记忆,我们将8个二进制位用一个十进制数表示,一个IP地址由四个十进制数表示,上述的IP地址表示为:
255.255.255.0
现在给你一个上述形式的IP地址,请回答IP地址的32个二进制位中,有多少位是1。
如IP地址为255.255.255.0,其中24位是1。
【输入形式】
有多组测试数据。
测试数据第一行是一个正整数T,表示测试数据组数。
每组测试数据是一个IP地址,形式为:
IP1.IP2.IP3.IP4
其中0 ≤IP1,IP2,IP3,IP4≤ 255,用十进制表示。每个IP地址不保证是实用IP地址。
40%的测试数据组数T 10≤T≤ 102;
30%的测试数据组数T 102≤T≤ 103;
20%的测试数据组数T 103≤T≤ 104;
10%的测试数据组数T 104≤T≤ 105;
【输出形式】
对于每个IP地址,输出一行包含一个非负整数:该IP地址的32个二进制位中,1的位数。
【样例输入】
5
255.255.255.0
127.0.0.1
0.0.0.1
1.2.3.4
0.0.0.0
【样例输出】
24
8
1
5
0
提示:样例中32位的IP地址为:
11111111111111111111111100000000
01111111000000000000000000000001
00000000000000000000000000000001
00000001000000100000001100000100
00000000000000000000000000000000
import java.util.Scanner;
// java中String.split()以特殊符号"."、 "|"、 "*"、 "\"、 "]"分割字符串用法:
// regex为\\\\,因为在java中\\表示一个\,而regex中\\也表示\,所以当\\\\解析成regex的时候为\\
// 关于点的问题是用string.split("[.]") 解决。
// 关于竖线的问题用 string.split("\\|")解决
// 关于星号的问题用 string.split("\\*")解决。
// 关于中括号的问题用 sring.split("\\[\\]")解决。
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
while (n > 0) {
String ip = sc.next();
String[] str = ip.split("[.]");
int[] num = new int[4];
int count = 0;
for (int i = 0; i < str.length; i++) {
num[i] = Integer.parseInt(str[i]);
int cur = 0;
int res = 0;
int jinwei = 1;
while (num[i] != 0) { // 将num[i]从十进制转为二进制表示(res)
cur = num[i] % 2;
num[i] = num[i] / 2;
res += cur * jinwei;
jinwei = jinwei * 10;
}
str[i] = String.valueOf(res); // 将二进制形式的res转成字符串,进而转成字符数组
char[] chars = str[i].toCharArray();
for (int j = 0; j < str[i].length(); j++) {
if (chars[j] == '1') {
count++;
}
}
}
System.out.println(count);
n--;
}
}
}