习题4-5(uva-1590)

#include <iostream>
#include <vector>
#include <stack>
#include <list>
#include <map>
#include <set>
#include <deque>
#include <queue>
#include <cstring>
#include <unordered_map>
#include <unordered_set>
#include <algorithm>
#include <numeric>
#include <chrono>
#include <ctime>
#include <cmath>
#include <cctype>
#include <string>
#include <cstdio>
#include <iomanip>


#include <thread>
#include <mutex>
#include <condition_variable>
#include <functional>
#include <iterator>
using namespace std;
union MIP {
	unsigned int ip;
	struct IPS
	{
		unsigned char str[4];
	}ips;
};

int main()
{
	int n;
	while (scanf("%d", &n) != EOF) {
		MIP mip,temp, mask;

		mip.ip = 0xFFFFFFFF, mask.ip = 0;

		for (int i = 0; i < n; ++i) {
			scanf("%d.%d.%d.%d", &temp.ips.str[0], &temp.ips.str[1], &temp.ips.str[2], &temp.ips.str[3]);
			//转换成小端模式 基本都是小端模式, 所以没有判断
			reverse(temp.ips.str, temp.ips.str + 4);
			//mip 记录相同的
			mip.ip &= temp.ip;
			//记录所有元素 相等于全集
			mask.ip |= temp.ip;
		}
		//得到不相同的
		mask.ip = mask.ip ^ mip.ip;
		//找最大的1
		if (mask.ip == 0)mask.ip = 0xFFFFFFFF;
		else {
			unsigned long long int t = 0x80000000;
			while (!(t & mask.ip)) t = t >> 1;
			mask.ip = ~((t << 1) - 1);
		}
		mip.ip &= mask.ip;

		reverse(mip.ips.str, mip.ips.str + 4);
		reverse(mask.ips.str, mask.ips.str + 4);

		printf("%d.%d.%d.%d\n", mip.ips.str[0], mip.ips.str[1], mip.ips.str[2], mip.ips.str[3]);
		printf("%d.%d.%d.%d\n", mask.ips.str[0], mask.ips.str[1], mask.ips.str[2], mask.ips.str[3]);
	}
	return 0;
}

判断大小端

union BigSmall
{
	BigSmall() :num(1) {}
	unsigned int num;
	struct Nums
	{
		unsigned char str[4];
	}nums;
};

bool IsSmallMode() {
	BigSmall bigsmall;
	return bigsmall.nums.str[0] == 1;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值