【很简洁】两行代码判断IP地址归属地是洲内还是洲外
支持多种语言
原理:根据IPv4地址首位判断是否属于亚太地区(APNIC)管辖
说明:仅限估计,有些情况下不是特别准确,建议用于服务器防火墙过滤等场合
Java(第一种):
String ip="114.5.1.4"; static final String N=new java.math.BigInteger("1ljkvi5u19606s37nxu2ao4bjh5ld594gocu1j05ftpgykadq8",36).toString(2); boolean inAsia=N.charAt(Integer.parseInt(ip.substring(0,ip.indexOf("."))))=='1';//true
Java(第二种):
//According to https://www.iana.org/assignments/ipv4-address-space/ipv4-address-space.xhtml static long[] co=new long[]{0x402200100930403cl,0x523ffffl,0x400024010110b00l,0x30303fl<<8}; public static boolean inAsia(String ip){ int c=Integer.parseInt(ip.substring(0,ip.indexOf("."))); return (co[c>>6]&(1l<<63-(63&c)))!=0; } public void demo(){ while(true)System.out.println(inAsia(new java.util.Scanner(System.in).nextLine())?"在亚太":"在洲外"); }
C/C++:
long long co[4]={0x402200100930403cll,0x523ffffll,0x400024010110b00ll,0x30303fll<<8}; char inAsia(const char* x){ for(int c=*x^'0',i=0;x[++i]^'.';c=(c<<3)+(c<<1)+(x[i]^'0')); return 1&(co[c>>6]>>63-(63&c)); } int main(){ for(char q[16];scanf("%s",q),1;puts({"在洲外","在亚太"}[inAsia(q)])); }
其中的大位数(256bit)实际为十六进制的:
402200100930403c000000000523ffff0400024010110b000030303f00000000
(完)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话