Description
Suppose you are reading byte streams from any device, representing IP addresses. Your task is to convert a 32 characters long sequence of '1s' and '0s' (bits) to a dotted decimal format. A dotted decimal format for an IP address is form by grouping 8 bits at a time and converting the binary representation to decimal representation. Any 8 bits is a valid part of an IP address. To convert binary numbers to decimal numbers remember that both are positional numerical systems, where the first 8 positions of the binary systems are:
27 26 25 24 23 22 21 20 128 64 32 16 8 4 2 1
Input
The input will have a number N (1<=N<=9) in its first line representing the number of streams to convert. N lines will follow.
Output
The output must have N lines with a doted decimal IP address. A dotted decimal IP address is formed by grouping 8 bit at the time and converting the binary representation to decimal representation.
Sample Input
4 00000000000000000000000000000000 00000011100000001111111111111111 11001011100001001110010110000000 01010000000100000000000000000001
Sample Output
0.0.0.0 3.128.255.255 203.132.229.128 80.16.0.1
题意 :
把给出的32位2进制数每8位已转换,转换成4个十进制数,以IP地址的形式输出。
解题思路:
每8位一遍历相加。
/*
_ooOoo_
o8888888o
88" . "88
(| -_- |)
O\ = /O
____/`---'\____
. ' \\| |// `.
/ \\||| : |||// \
/ _||||| -:- |||||- \
| | \\\ - /// | |
| \_| ''\---/'' | |
\ .-\__ `-` ___/-. /
___`. .' /--.--\ `. . __
."" '< `.___\_<|>_/___.' >'"".
| | : `- \`.;`\ _ /`;.`/ - ` : | |
\ \ `-. \_ __\ /__ _/ .-` / /
======`-.____`-.___\_____/___.-`____.-'======
`=---='
.............................................
*/
#include <map>
#include <queue>
#include <cmath>
#include <cstdio>
#include <string>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#define pi 3.1415926
#define INF 123456789
using namespace std;
int flag[8] = {1, 2, 4, 8, 16, 32, 64, 128};
int main(){
int num1, num2, num3, num4, i, t;
char str[100];
scanf("%d%*c", &t);
while(t --){
scanf("%s", str);
num1 = num2 = num3 = num4 = 0;
for(i = 31; i >= 24; i --)
if(str[i] == '1')
num1 += flag[8 - (i - 24) - 1]; // 注意不要写成flag[8 - i - 24 - 1], 按照计算的优先级先算8-i为负数,所以要用括号括起来
for(i = 23; i >= 16; i --)
if(str[i] == '1')
num2 += flag[8 - (i - 16) - 1];
for(i = 15; i >= 8; i --)
if(str[i] == '1')
num3 += flag[8 - (i - 8) - 1];
for(i = 7; i >= 0; i --)
if(str[i] == '1')
num4 += flag[8 - i - 1];
printf("%d.%d.%d.%d\n", num4, num3, num2, num1);
}
return 0;
}
/*
*/