2021-09-02:IP 到 CIDR。给定起始IP和整数n,返回长度最小的CIDR块。力扣751。比如:ip=255.0.0.7,n=10,输出:[“255.0.0.7/32“,“255.0.0.
2021-09-02:IP 到 CIDR。给定起始IP和整数n,返回长度最小的CIDR块。力扣751。比如:ip=255.0.0.7,n=10,输出:[“255.0.0.7/32”,“255.0.0.8/29”,“255.0.0.16/32”]。
福大大 答案2021-09-02:
具体见代码。
代码用golang编写。代码如下:
package main
import (
"fmt"
"strconv"
"strings"
)
func main() {
ip := "255.0.0.7"
n := 10
ret := ipToCIDR(ip, n)
fmt.Println(ret)
}
func ipToCIDR(ip string, n int) []string {
// ip -> 32位整数
cur := status(ip)
// cur这个状态,最右侧的1,能表示下2的几次方
maxPower := 0
// 已经解决了多少ip了
solved := 0
// 临时变量
power := 0
ans := make([]string, 0)
for n > 0 {
// cur最右侧的1,能搞定2的几次方个ip
// cur : 000...000 01001000
// 3
maxPower = mostRightPower(cur)
// cur : 0000....0000 00001000 -> 2的3次方的问题
// sol : 0000....0000 00000001 -> 1 2的0次方
// sol : 0000....0000 00000010 -> 2 2的1次方
// sol : 0000....0000 00000100 -> 4 2的2次方
// sol : 0000....0000 00001000 -> 8 2的3次方
solved = 1
power = 0
// 怕溢出
// solved
for (solved<<1) <= n && (power+1) <= maxPower {
solved <<= 1
power++
}
ans = append(ans, content(cur, power))
n -= solved
cur += solved
}
return ans
}
// ip -> int(32位状态)
func status(ip string) int {
ans := 0
move := 24
for _, str := range strings.Split(ip, ".") {
// 17.23.16.5 "17" "23" "16" "5"
// "17" -> 17 << 24
// "23" -> 23 << 16
// "16" -> 16 << 8
// "5" -> 5 << 0
strInt, err := strconv.Atoi(str)
if err != nil {
fmt.Println("错误", err)
return 0
}
ans |= strInt << move
move -= 8
}
return ans
}
var map0 = make(map[int]int)
// 1 000000....000000 -> 2的32次方
func mostRightPower(num int) int {
// map只会生成1次,以后直接用
if len(map0) == 0 {
map0[0] = 32
for i := 0; i < 32; i++ {
// 00...0000 00000001 2的0次方
// 00...0000 00000010 2的1次方
// 00...0000 00000100 2的2次方
// 00...0000 00001000 2的3次方
map0[1<<i] = i
}
}
// num & (-num) -> num & (~num+1) -> 提取出最右侧的1
return map0[num&(-num)]
}
func content(status int, power int) string {
builder := make([]byte, 0)
for move := 24; move >= 0; move -= 8 {
builder = append(builder, []byte(fmt.Sprintf("%d.", status&(255<<move)>>move))...)
}
builder[len(builder)-1] = '/'
builder = append(builder, []byte(fmt.Sprintf("%d", 32-power))...)
return string(builder)
}
执行结果如下:

2021-09-02:IP 到 CIDR。给定起始IP和整数n,返回长度最小的CIDR块。力扣751。比如:ip=255.0.0.7,n=10,输出:[“255.0.0.7/32“,“255.0.0.的更多相关文章
- System.Web.HttpCompileException (0x80004005): (0): error CS0016: 未能写入输出文件
重新系统后,iis asp.net站点老是出现: System.Web.HttpCompileException (0x80004005): (0): error CS0016: 未能写入输出文件“c ...
- 07/29/2013 02:10:02 AM - CMDPHP: Poller[0] Host[6] DS[10] WARNING: Result from SNMP not valid. Partial Result: U
snmpwalk -c public -v2c 客户端ip地址 自定义的oid 能取到数据,但是服务器端就是图片一片空白 rrdtool fetch 文件名.rrd 查看到的全都是nan cac ...
- orcle :Could not initialize "D:\app\Administrator\product\11.2.0\dbhome_1\bin\oci.dll" Make sure you have the 32 bits Oracle Client installed.
服务器重启后,数据库登录信息为空 错误信息: ---------------------------(Not logged on) - PL/SQL Developer---------------- ...
- Linux下Oracle 10.2.0.1升级到10.2.0.4总结
最近部署测试环境时,将测试环境ORACLE数据库从10.2.0.1升级到了10.2.0.4,顺便整理记录一下升级过程. 实验环境: 操作系统:Oracle Linux Server release 5 ...
- USB 3.0规范中译本 第10章 集线器,主机下行口以及设备上行口规范
本文为CoryXie原创译文,转载及有任何问题请联系cory.xie#gmail.com. 本章描述USB 3.0 集线器的体系结构要求.本章还描述主机下行口和集线器下行口之间功能性的不同之处,以及设 ...
- SELECT INTO和INSERT INTO SELECT的区别 类似aaa?a=1&b=2&c=3&d=4,如何将问号以后的数据变为键值对 C# 获取一定区间的随即数 0、1两个值除随机数以外的取值方法(0、1两个值被取值的概率相等) C# MD5 加密,解密 C#中DataTable删除多条数据
SELECT INTO和INSERT INTO SELECT的区别 数据库中的数据复制备份 SELECT INTO: 形式: SELECT value1,value2,value3 INTO Ta ...
- IIS发布网站遇到 编译器错误消息: CS0016: 未能写入输出文件“c:\Windows\Microsoft.NET\Framework64\v4.0.30319\Temporary 编
编译错误: 说明:在编译向该请求提供服务所需资源的过程中出现错误.请检查下列特定错误详细信息并适当地修改源代码. 编译器错误消息:CS0016: 未能写入输出文件“c:\Windows\Microso ...
- rac 10g 10.2.0.1升级到10.2.0.5具体解释
RAC 10.2.0.1 升级到 10.2.0.5 一. 准备: Patch 包:p8202632_10205_LINUX.zip 节点数:3个节点 RAC1 RAC2 ...
- .NET 跨平台RPC框架DotNettyRPC Web后台快速开发框架(.NET Core) EasyWcf------无需配置,无需引用,动态绑定,轻松使用 C# .NET 0配置使用Wcf(半成品) C# .NET Socket 简单实用框架 C# .NET 0命令行安装Windows服务程序
.NET 跨平台RPC框架DotNettyRPC DotNettyRPC 1.简介 DotNettyRPC是一个基于DotNetty的跨平台RPC框架,支持.NET45以及.NET Standar ...
- Spark2.0机器学习系列之10: 聚类(高斯混合模型 GMM)
在Spark2.0版本中(不是基于RDD API的MLlib),共有四种聚类方法: (1)K-means (2)Latent Dirichlet allocation (LDA) ...
随机推荐
- php 中 session存储
转载网址: https://blog.csdn.net/miliu123456/article/details/107048378/ php 中 session 更换存储方式(file, redis, ...
- Spring-传统方式(XML)创建webapp
如何搭建一个传统的webapp项目[Java后端] 使用xml 来搭建 SSM 环境,要求 Tomcat 的版本必须在 7 以上 QuickStart 1创建工程 创建一个新模块[普通的 Maven ...
- Android笔记--案例:找回密码
找回密码 具体实现: 登录成功: 报告密码不同: 报告验证码错误: 代码相关: 找回密码的界面很简单,不细说了,直接写就行 找回密码的逻辑实现: 下一次就去写数据存储啦! 拜拜!
- 使用sync.Once实现高效的单例模式
1. 简介 本文介绍使用sync.Once来实现单例模式,包括单例模式的定义,以及使用sync.Once实现单例模式的示例,同时也比较了其他单例模式的实现.最后以一个开源框架中使用sync.Once实 ...
- 用户user退出登录
/** * 用户退出登录 * @param request * @return */ @PostMapping("/loginout") public R<String> ...
- Hadoop 安装及目录结构
一.准备工作 [1]创建用户:useradd 用户名[2]配置创建的用户具有 root权限,修改 /etc/sudoers 文件,找到下面一行,在root下面添加一行,如下所示:(注意:需要先给sud ...
- Solon Initializr v1.2 发布
Solon Initializr 是 Solon 框架的模板生成器项目.本期更新增加了快捷组合包的依赖选择,并生成对应的项目模板. 更新说明 增加 Solon Lib 依赖选择,并生成对应项目 增加 ...
- Schillace 定律 背后的 Sam Schillace
微软semantic-kernel(SK)团队发布了一篇博客文章:Early Lessons From GPT-4: The Schillace Laws[1] ,微软的CVP , Deputy CT ...
- .NET周报 【3月第4期 2023-03-24】
国内文章 .NET应用系统的国际化-多语言翻译服务 https://www.cnblogs.com/tianqing/p/17232559.html 本文重点介绍了多语言翻译服务的设计和实现.文章描述 ...
- MongoDB基础知识梳理
简介 MongoDB 是由 C++ 编写的开源 NoSQL 和基于文档的数据库.MongoDB 提供了面向文档的存储方式,操作起来比较简单和容易,支持"无模式"的数据建模,可以存储 ...