1)IPv4地址是一个32位的二进制数,通常被分割位4个“8位二进制数”,为了方便,通常使用“点分十进制”的形式表示成(a.b.c.d)的形式,其中,a,b,c,d都是0~255之间的十进制整数,另外,IP地址也可以使用一个3的整数T表示,根据点分十进制中的a,b,c,d,计算T的方法就是:

T=a*256*256*256+b*256*256+c*256+d;

2)那么如何根据T反求出此IP地址的“点分十进制”形式呢?题目描述:

IP地址的长度为32,即有2^32-1个地址。IP地址一般采用点分十进制表示法,例如"192.168.1.1"。IP地址也可以直接用一个32位的整数进行表示。本题目要求根据给定的整数IP地址表示发,将其转换为点分十进制的形式。
举个例子:
输入整数IP地址为 3232235777
其对应十六进制为 0xC0A80101
每字节转为十进制 0xC0=192,0xA8=168,0x01=1,0x01=1
则输出为 192.168.1.1

有两种方法可以采用,我们首先谈谈怎么使用“位操作”解决这个问题。IP地址实质上是一个32位的二进制形式,虽然说T是一个整数,不过其在计算机存储形式仍然是二进制的形式,使用“位操作”可以方便的得到IP地址中四个网段(也就是4个“8位二进制数”),代码如下:

public static String bitOperation(){
Long ipAddrLong=0l;
Scanner scanner=new Scanner(System.in);
if (scanner.hasNextLong()) {
ipAddrLong=scanner.nextLong();
}
long test;
StringBuilder sb=new StringBuilder();
for (int i = 0; i <4; i++) {
test=(ipAddrLong&0xff);//当与操作的两个操作数位数不一致时,在较少位的操作数左侧补0,直至位数相等
sb.insert(0, Long.toString(test));//StringBuild的insert()方法很好用
//sb.append(Long.toString(test));
if (i<3) {
sb.insert(0, ".");
}
ipAddrLong=ipAddrLong>>8;//无论是左移还是右移,操作数都是在“>>”或者"<<"的左侧,右侧是要改变的位数,并且移动之后,
//并不改变原操作数的内容,而是新创造了一个数值。左移是将操作数的二进制码整体移动指定位数,所以要操作数最右侧的若干位会丢失,为了保证从操作数
//的位数不变,在最左侧补上与移动次数相同个数的0。
}
return sb.toString();
}

与左移不同的是,右移运算符有两个:“>>”和“>>>”。对于“>>”而言,把操作数的整体二进制码右移指定位之后,左侧空出来的部分使用操作数原来的符号位代替。而“>>>”是无符号右移操作符,左侧空出来的部分总是使用0代替。

参考:http://www.what21.com/programming/java/java-algorithm/ip.html

3)还有另外一种方法可以将IP地址的正数形式转化为“点分十进制”的形式,主要就是取模和取余,代码如下:

 private static String getIP(Long ipaddr) {
long y = ipaddr % 256;
long m = (ipaddr - y) / (256 * 256 * 256);
long n = (ipaddr - 256 * 256 *256 * m - y) / (256 * 256);
long x = (ipaddr - 256 * 256 *256 * m - 256 * 256 *n - y) / 256;
return m + "." + n + "." + x + "." + y;
}

参考:http://blog.csdn.net/shb_derek1/article/details/8064308

利用位操作进行IP地址的转化的更多相关文章

  1. python中利用正则表达式匹配ip地址

    现在有一道题目,要求利用python中re模块来匹配ip地址,我们应如何着手? 首先能想到的是ip地址是数字,正则表达式是如何匹配数字的呢? \d或[0-9] 对于这个问题,不要一下子上来就写匹配模式 ...

  2. python 利用正则表达式获取IP地址

    例:import retest= '$MYNETACT: 0,1,"10.10.0.9"'pattern =re.compile(r'"(\d+\.\d+\.\d+\.\ ...

  3. 【Oracle】oracle利用正则表达式拆分IP地址

    使用oracle提供的regexp_substr()函数,对将IPV4地址分成4段: select v.ip as ip_address, regexp_substr(v.ip,,) as A, re ...

  4. 利用Java获取ip地址

    方法1 public static String getIp2(HttpServletRequest request) { String ip = request.getHeader("X- ...

  5. 给定一个IP地址,转化为二进制32位,再转化为十进制,写出一个方法让其十进制转为IP地址

    十进制是已知的数值 第一种方法: <script type="text/javascript"> var num=2148140545; var str=num.toS ...

  6. Python之通过IP地址库获取IP地理信息

    利用第三方的IP地址库,各个公司可以根据自己的业务情况打造自己的IP地址采集分析系统.例如游戏公司可以采集玩家地区信息,进行有针对性的运营策略,还可能帮助分析玩家网络故障分布等等. #!/usr/bi ...

  7. WordPress使用淘宝IP地址库的API显示评论者的位置信息(二)

    1 淘宝IP地址库的接口说明 在上一篇文章<WordPress使用淘宝IP地址库的API显示评论者的位置信息(一)>中,vfhky使用了新浪工具提供的这个IP接口显示博客评论者的位置信息. ...

  8. Python自动化运维——IP地址处理模块

    Infi-chu: http://www.cnblogs.com/Infi-chu/ 模块:IPy 功能:辅助我们高效的完成IP的规划工作 安装: wget https://pypi.python.o ...

  9. ip地址库 与浏览器的关系

    https://zhidao.baidu.com/question/325152705.html 只要手机连接数据上网就会产生ip,只要进入了淘宝,就能查出用户访问记录的. 手机是运营商动态分配的.它 ...

随机推荐

  1. Ubuntu1604 install netease-cloud music

    Two issue: 1. There is no voice on my computer, and the system was mute and cannot unmute. eric@E641 ...

  2. Spring 中 AbstractExcelView 支持根据模板生成Excel文件. 通过设置 view 的 URL 属性指定模板的路径

     注意:1. 模板需放在 WEB-INF 目录下2. 指定模板路径时不需要添加扩展名, Spring将自动添加 .xls 到URL 属性中.3. 在指定URL前需先设置 view 的 Applicat ...

  3. linux下输出tomcat控制台信息

    进入tomcat/logs/目录执行命令:tail -f catalina.out即可

  4. 【BZOJ4657】tower [网络流]

    炮塔 Time Limit: 10 Sec  Memory Limit: 256 MB Description Input Output 一行一个整数表示答案. Sample Input 4 5 0 ...

  5. codeforces B. Okabe and Banana Trees 结论题

    题目传送门 这道题 枚举一波y就好了 要求x,y整数 所以y最多1000个 然后算一波答案更新就好了 233 #include<cstdio> #include<cstring> ...

  6. 用 C# 代码如何实现让你的电脑关机,重启,注销,锁定,休眠,睡眠

    简介 本文讲述了用 C# 代码如何实现让你的电脑关机,重启,注销,锁定,休眠,睡眠. 如何实现 首先,使用 using 语句添加我们需要的命名空间: using System.Diagnostics; ...

  7. Mybatis三剑客

    1.Mybatis-generator 自动化生成数据库交互代码->dao+pojo+xml 2.Mybatis-plugin dao文件和xml自动跳转,验证正确性,在xml中只能提示等功能 ...

  8. 【bzoj3227】红黑树

    神TM的红黑树,其实本质上应该还是一种树dp的问题…… 一开始想了一个比较裸的树dp,后来发现还有更强的做法. 每个前端黑节点是看作一个物品,然后这就是很典型的树形dp的问题. 不过可以这么考虑,考虑 ...

  9. go语言的定时器

    package main import ( "fmt" "time" ) func main(){ //创建一个定时器,时间为2s,2s过后会自动往通道里面写入 ...

  10. xpath用法(持续更新ing)

    article:选取所有article元素的所有子节点 /article:选取根元素article article/a:选取所有属于article的子元素的a元素 //div:选取所有div元素 ar ...