- 浏览: 46824 次
- 性别:
- 来自: martian
最新评论
-
norce:
解压后的文件引入到java过程中出了好多错呀,有待进一步改进奥 ...
自己写了个java反编译脚本,可以很方便的将jar包反编译 -
xinghe_wang:
谢谢你啊!最近正在 学习SpringRoo 。这个对我的帮助 ...
spring roo页面构成部分分析 -
k213602845:
赞一个。。
自己写了个java反编译脚本,可以很方便的将jar包反编译 -
请输入用户名:
lzp0070007 写道2.当运行到“请输入反编译目录”时候 ...
自己写了个java反编译脚本,可以很方便的将jar包反编译 -
lzp0070007:
2.当运行到“请输入反编译目录”时候会弹出解压后的目录,请将包 ...
自己写了个java反编译脚本,可以很方便的将jar包反编译
二进制的与、或、非运算特殊用法的不同运用场合:
1.权限控制
下面我用几个数字来代表增,删,改,查。(注:1带有有权限,有几个1,就代表有几个权限,1的位置不同,所带表的权限也不同)
管理员拥有所有的权限,所以,控制管理员的权限的数字为(15),转化二进制的格式为:(1111)。算法为:“1|2|4|8“
撤销管理员的删权限(2),控制管理员的权限的数字为(13),转化二进制的格式为:(1101)。算法为:”15 & (~2)”
判断管理员的权限中是否有某个权限。如在控制管理员的权限的数字为(13)时,判断管理员是否具有修改的权限(4)。算法为:“13 & 4==0”,假如等于0的话,表示,权限不存在,假如不等于0的话,表示,此权限已经存在。
2.分类组合
假如一个类要支持很多操作,操作和操作之间可能没有联系,可能有相反关系无法共存,可能有特殊关系必须共存,这种要分很多类还要处理联系的情况下可以考虑采用二进制来解决。
我这里的例子是java做的文件搜索,用的是递归,搜索的时候可以搜索文件、文件夹,搜索的方式可以有正则表达式匹配、以特定开始、以特定结束、以是否包含的方式。而且除了正则则要单独处理,其他方式直接可以进行组合。
通过二进制分类
当程序传入规则之后,我可以很方便的加入到 _rule中
去除 和 判断是否有这个规则
之后处理时进行 if分类 就可以很方便
大体就是这个个意思,完整代码
3.快速找出两个list(或数组)中不同的对象
一般的想法都是通过对两个list进行 循环嵌套,每找到一个,remove一个,这样的话有两个缺点:一个是速度,在最差的情况下是O(n^2),这对于数量大的是比较慢的。二是由于要remove元素,不能采用iterator尽心循环(据说采用迭代器java会有缓存优化)。
这个就可以采用二进制来解决,其实这里用二进制只是一种方式,完全可以用 权的概念,一个权设为10,一个权设为1(任意两个不相等的数都可以,如果多个list和数组的话,还是二进制方式比较清楚)。假如数组种的对象通过code来进行标示,新建一个
分别对两个list进行第一次循环
循环list1的时候:
循环list2的时候:
这样一来,所有list1独有的,countMap表现为Value为1,list2独有的,countMap表现为Value为10,共有的表现为Value为11
然后进行第二次循环,将list1、list2根据code进行分类,组合成两个HashMap,以方便根据code找出code相同的部分(code相同不代表其他属性也相同,实际处理中可能会有用,不管你用没用到,反正我用到了)和code不同的部分。
之后就是 根据找出来的code,各自的map中获取对应的对象了。
复制度O(2n)
我能想到的是这个方法,不知道有没有更好的,望提示!!!
上代码:
1.权限控制
下面我用几个数字来代表增,删,改,查。(注:1带有有权限,有几个1,就代表有几个权限,1的位置不同,所带表的权限也不同)
1---------增--------(转二进制)-----(0001) 2---------删----------------------(0010) 4--------改----------------------(0100) 8--------查----------------------(1000)
管理员拥有所有的权限,所以,控制管理员的权限的数字为(15),转化二进制的格式为:(1111)。算法为:“1|2|4|8“
撤销管理员的删权限(2),控制管理员的权限的数字为(13),转化二进制的格式为:(1101)。算法为:”15 & (~2)”
判断管理员的权限中是否有某个权限。如在控制管理员的权限的数字为(13)时,判断管理员是否具有修改的权限(4)。算法为:“13 & 4==0”,假如等于0的话,表示,权限不存在,假如不等于0的话,表示,此权限已经存在。
2.分类组合
假如一个类要支持很多操作,操作和操作之间可能没有联系,可能有相反关系无法共存,可能有特殊关系必须共存,这种要分很多类还要处理联系的情况下可以考虑采用二进制来解决。
我这里的例子是java做的文件搜索,用的是递归,搜索的时候可以搜索文件、文件夹,搜索的方式可以有正则表达式匹配、以特定开始、以特定结束、以是否包含的方式。而且除了正则则要单独处理,其他方式直接可以进行组合。
通过二进制分类
/** 查找文件夹 */ public static final int FIND_DIRECTORY = 1; /** 查找文件 */ public static final int FIND_FILE = 2; /** 正则查找 */ public static final int FIND_BY_REGEX = 4; /** 起始于 */ public static final int FIND_START_WITH = 8; /** 结束于 */ public static final int FIND_END_WITH = 16; /** 包含于 */ public static final int FIND_CONTAIN = 32; // rule private int _rule = 0;
当程序传入规则之后,我可以很方便的加入到 _rule中
/** 添加规则 */ public int ruleAdd(int r) { _rule = _rule | r; return _rule; }
去除 和 判断是否有这个规则
/** 去除规则 */ public int ruleRemove(int r) { _rule = _rule & (~r); return _rule; } /** 是否包含规则 */ public Boolean hasRule(int r) { return (_rule & r) != 0; }
之后处理时进行 if分类 就可以很方便
/** * 判断是否满足规则用户指定的rule (正则表达式 ______ 开始于 __________ 结束于) * * @param content * @return */ public Boolean meetRule(File pathname) { Boolean result = true; // 查找路径 if (hasRule(FIND_DIRECTORY)) { result = result && pathname.isDirectory(); } // 查找文件 if (hasRule(FIND_FILE)) { result = result && pathname.isFile(); } String fileName = pathname.getName().toUpperCase(); // 按照开始于查找 if (hasRule(FIND_START_WITH)) { result = result && fileName.startsWith(_fix.get(FIND_START_WITH).toUpperCase()); } // 按照结束于查找 if (hasRule(FIND_END_WITH)) { result = result && fileName.endsWith(_fix.get(FIND_END_WITH).toUpperCase()); } // 文件名包含查找 if (hasRule(FIND_CONTAIN)) { result = result && fileName.contains(_fix.get(FIND_CONTAIN).toUpperCase()); } // 按照正则查找 不区分大小写 if (_rule == FIND_BY_REGEX) { result = result && Pattern.compile(_fix.get(FIND_BY_REGEX), Pattern.CASE_INSENSITIVE).matcher(fileName).find(); } return result; }
大体就是这个个意思,完整代码
/** * 查找指定路径下 满足条件的文件、文件夹(不区分大小写) * * @see * @author kaven * @version 1.0, 2011-8-27 * @since 1.0, 2011-8-27 */ public class PathSearch { /** 查找文件夹 */ public static final int FIND_DIRECTORY = 1; /** 查找文件 */ public static final int FIND_FILE = 2; /** 正则查找 */ public static final int FIND_BY_REGEX = 4; /** 起始于 */ public static final int FIND_START_WITH = 8; /** 结束于 */ public static final int FIND_END_WITH = 16; /** 包含于 */ public static final int FIND_CONTAIN = 32; // rule private int _rule = 0; // 用户输入的用来匹配文件名的字段 或者正则 private Map<Integer, String> _fix = new HashMap<Integer, String>(); // 文件 private List<File> _files = new ArrayList<File>(); public PathSearch() { } // public PathSearch(Map<Integer, String> aFix) { // // this._fix = aFix; // } /** 添加规则 */ public int ruleAdd(int r) { _rule = _rule | r; return _rule; } /** 去除规则 */ public int ruleRemove(int r) { _rule = _rule & (~r); return _rule; } /** 是否包含规则 */ public Boolean hasRule(int r) { return (_rule & r) != 0; } /** * 判断是否满足规则用户指定的rule (正则表达式 ______ 开始于 __________ 结束于) * * @param content * @return */ public Boolean meetRule(File pathname) { Boolean result = true; // 查找路径 if (hasRule(FIND_DIRECTORY)) { result = result && pathname.isDirectory(); } // 查找文件 if (hasRule(FIND_FILE)) { result = result && pathname.isFile(); } String fileName = pathname.getName().toUpperCase(); // 按照开始于查找 if (hasRule(FIND_START_WITH)) { result = result && fileName.startsWith(_fix.get(FIND_START_WITH).toUpperCase()); } // 按照结束于查找 if (hasRule(FIND_END_WITH)) { result = result && fileName.endsWith(_fix.get(FIND_END_WITH).toUpperCase()); } // 文件名包含查找 if (hasRule(FIND_CONTAIN)) { result = result && fileName.contains(_fix.get(FIND_CONTAIN).toUpperCase()); } // 按照正则查找 不区分大小写 if (_rule == FIND_BY_REGEX) { result = result && Pattern.compile(_fix.get(FIND_BY_REGEX), Pattern.CASE_INSENSITIVE).matcher(fileName).find(); } return result; } /** * 添加规则(等价于 ruleAdd) * * @param rule */ public void addRule(int rule) { ruleAdd(rule); } /** * 添加规则 和 规则验证字段 * * @param rule * @param value */ public void addRule(int rule, String value) { ruleAdd(rule); this._fix.put(rule, value); } /** * 根据给定的path 查找其下满足特定条件的文件、文件夹 */ public void findUnderPath(String path) { File directory = new File(path); if (!directory.exists()) { // 路径不存在 return; } File[] files = directory.listFiles(new FileFilter() { @Override public boolean accept(File pathname) { return meetRule(pathname); } }); _files = Arrays.asList(files); } /** * 根据指定的path 查找其下包括子文件夹 所有满足特定条件的文件、文件夹 * * @return */ public void findDeepUnderPath(File pathName) { if (!pathName.exists()) { return; } // 获取所有 符合规则的文件 列表 File[] files = pathName.listFiles(new FileFilter() { @Override public boolean accept(File pathname) { return meetRule(pathname); } }); // 添加到结果集列表中 _files.addAll(Arrays.asList(files)); // 查找所有目录 File[] directories = pathName.listFiles(new FileFilter() { @Override public boolean accept(File pathname) { return pathname.isDirectory(); } }); // 获取子文件夹下的文件 for (File directory : directories) { findDeepUnderPath(directory); } } public List<File> getFiles() { return _files; } @Test public void testFind() { String path = "F:\\work_tools"; PathSearch ps = new PathSearch(); // ps.addRule(FIND_FILE); ps.addRule(FIND_BY_REGEX, "[\\d]"); // ps.addRule(FIND_END_WITH, "rar"); // ps.findUnderPath(path); ps.findDeepUnderPath(new File(path)); List<File> files = ps.getFiles(); for (File f : files) { System.out.println(f.getPath()); } } // @Test public void testRule() { System.out.println(ruleAdd(1)); System.out.println(ruleAdd(4)); System.out.println(ruleAdd(8)); System.out.println(hasRule(4)); System.out.println(ruleRemove(4)); System.out.println(hasRule(4)); } }
3.快速找出两个list(或数组)中不同的对象
一般的想法都是通过对两个list进行 循环嵌套,每找到一个,remove一个,这样的话有两个缺点:一个是速度,在最差的情况下是O(n^2),这对于数量大的是比较慢的。二是由于要remove元素,不能采用iterator尽心循环(据说采用迭代器java会有缓存优化)。
这个就可以采用二进制来解决,其实这里用二进制只是一种方式,完全可以用 权的概念,一个权设为10,一个权设为1(任意两个不相等的数都可以,如果多个list和数组的话,还是二进制方式比较清楚)。假如数组种的对象通过code来进行标示,新建一个
Map<String,Integer> countMap = new HashMap<String,Integer>()//key -- > code, value -- > 权
分别对两个list进行第一次循环
循环list1的时候:
countMap.put(code,10);
循环list2的时候:
if(null == countMap.get(code)){ countMap.put(code, 0);//初始化为0 } int count = countMap.get(code);//获取当前权 countMap.put(code, count + 1);//更新权
这样一来,所有list1独有的,countMap表现为Value为1,list2独有的,countMap表现为Value为10,共有的表现为Value为11
然后进行第二次循环,将list1、list2根据code进行分类,组合成两个HashMap,以方便根据code找出code相同的部分(code相同不代表其他属性也相同,实际处理中可能会有用,不管你用没用到,反正我用到了)和code不同的部分。
之后就是 根据找出来的code,各自的map中获取对应的对象了。
复制度O(2n)
我能想到的是这个方法,不知道有没有更好的,望提示!!!
上代码:
/** * 通过3次循环,对field 进行快速分类,找出彼此code不同的TableField * @author qihuan * */ public class QuickDiff { private List<TableField> oldFieldPop = new ArrayList<TableField>(); private List<TableField> newFieldAppend = new ArrayList<TableField>(); private List<String> commonCode = new ArrayList<String>(); private Map<String, TableField> newFieldMap; private Map<String, TableField> oldFieldMap; public QuickDiff(){ } /** * 通过3次循环,对field 进行快速分类 * @param oldFields * @param newFields */ public void doDiff(List<TableField> oldFields,List<TableField> newFields){ // key:desc -- value:对应出现次数 Map<String,Integer> countMap = new HashMap<String, Integer>(); addToMap(countMap,oldFields,1);//old 权为 1 addToMap(countMap,newFields,10);//new 权为10 newFieldMap = turnToMapByCode(newFields); oldFieldMap = turnToMapByCode(oldFields); //对 独有的code进行分类 for(String code : countMap.keySet()){ int value = countMap.get(code); if(value == 11){ commonCode.add(code); //do nothing }else if(value == 10){ newFieldAppend.add(newFieldMap.get(code)); }else if(value == 1){ oldFieldPop.add(oldFieldMap.get(code)); } } } /** * 按照 code 进行分类 * @param fields * @return */ private Map<String, TableField> turnToMapByCode(List<TableField> fields){ Map<String, TableField> fieldMap = new HashMap<String, TableField>(); for(TableField tf : fields){ String code = tf.getCode(); fieldMap.put(code, tf); } return fieldMap; } /** * * @param countMap 计数map * @param fields * @param value 权 */ private void addToMap(Map<String, Integer> countMap, List<TableField> fields, int value) { for(TableField tf : fields){ String code = tf.getCode(); if(null == countMap.get(code)){ countMap.put(code, 0); } int count = countMap.get(code);//获取当前权 countMap.put(code, count + value);//更新权 } } /** * old 独有的 * @return */ public List<TableField> getOldFieldPop() { return oldFieldPop; } /** * new 独有的 * @return */ public List<TableField> getNewFieldAppend() { return newFieldAppend; } /** * 共有的 * @return */ public List<String> getCommonCode() { return commonCode; } /** * newField to Map * @return */ public Map<String, TableField> getNewFieldMap() { return newFieldMap; } /** * oldField to Map * @return */ public Map<String, TableField> getOldFieldMap() { return oldFieldMap; } }
发表评论
-
spring roo页面构成部分分析
2012-05-17 20:47 1594自己之前做的笔记,分析了一下spring roo生成的页面部分 ... -
java文件读取缓存类
2011-12-29 18:34 7836流程图: <pre> final 外部对象 ... -
java利用反射校验某对象中对象中某项属性的值是否和期望的相同
2011-12-29 17:27 1460原理是将传入的属性名,拼接成 get方法(布尔类型需另作处理, ... -
动态代理模式分析--基于马士兵视频例子
2011-01-30 18:53 3636代码改天上传。现在上传不上来、、 关于模式之外的代码准备:动态 ... -
基于dom4j编写的xml数据源操作类
2011-01-30 13:15 1016package test; import java.io ... -
tomcat 启动加载项目
2011-01-30 13:06 2289Tomcat启动时加载 通过这个可以实现:程序在启动过程中加载 ... -
对一个通过反射进行排序的分析
2011-01-20 22:13 912对一个通过反射进行排序的分析 在百度知道看到的,顺便回答了,在 ... -
基于dom4j编写的xml数据源操作类
2010-12-17 20:16 835这个是以前写的简单例子,后来发现 xstream 的做法跟我想 ... -
自己写了个java反编译脚本,可以很方便的将jar包反编译
2010-12-14 22:33 5501自己写了个java反编译脚本,可以很方便的将jar包反编译 ... -
搜集的jar包,mark一下。
2010-12-14 22:14 955搜集的jar包,mark一下。 db2数据库的jar包 c3 ... -
实习单位的数字的处理的类
2010-12-07 18:58 1279package com.anyi.business.b ... -
ant learn
2010-12-07 15:39 806this is the one which names bui ... -
有效地java注释使用方法
2010-12-07 15:28 975package yfTest.shixi; /** ... -
简单的测试类,一些知识点
2010-12-07 15:26 800package yfTest.shixi; ... -
1亿条数据中获取最大100条,论坛找来的代码TreeSet 和另外一种方法
2010-12-07 15:16 1979import java.util.ArrayList; ... -
处理精确小数运算
2010-12-07 14:49 927处理精确小数运算 package yfTest.shixi ... -
二叉树(留着用)
2010-12-07 14:46 909package yfTest.shixi; impo ...
相关推荐
3. ASCII码:C语言中的字符实际上对应ASCII码,一个字符可以用其ASCII码的二进制表示。例如,字符'0'到'9'的ASCII值为48到57,字符'A'到'F'的ASCII值为65到70,字符'a'到'f'的ASCII值为97到102。 二、C语言实现十六...
BinCalc计算器为用户提供了直观的界面,用于执行二进制计算,这对于学习计算机科学原理或者解决实际问题非常有帮助。 二、八进制系统:八进制,或称作基数8系统,由0到7这八个数字组成。在早期的计算机系统中,八...
在二进制和其他非十进制系统中,这些运算需要遵循特定的规则。例如,二进制加法中,当两位相加等于或超过进位值(2)时,会产生一次进位。二进制乘法则涉及到对每一位进行乘法运算后进行位移,同样需要考虑进位。 ...
进制转换器是一种工具,用于...掌握不同进制之间的转换技巧,不仅有助于解决实际的编程问题,也是提升计算机科学理论知识的重要途径。无论是对初学者还是专业人士,熟悉进制转换器的使用和原理都能极大地提高工作效率。
《MATLAB神经网络和优化算法:10 遗传算法采用二进制编码》 在计算机科学领域,特别是优化问题解决中,遗传算法(Genetic Algorithm, GA)是一种受到生物进化过程启发的...这将有助于解决实际工程和科研中的优化问题。
首先,ALU的设计目标是能够处理多种算术运算(如加法、减法、乘法、除法)和逻辑运算(如与、或、非、异或等)。74LS181是一款4位的运算功能发生器,能够执行16种不同的运算组合,这包括所有基本的二进制算术和逻辑...
掌握这些知识不仅能提升编程技能,还能帮助解决实际项目中的数据处理问题。对于这个特定的源码文件,它提供了一个完整的解决方案,使得开发者可以方便地在两者之间进行转换,尤其对于包含非ASCII字符的字符串。
6. **计算机中采用二进制的原因**:计算机采用二进制是因为其物理实现简单(如电子开关的开/关状态),可靠性高,运算规则简单(如与、或、非等逻辑运算),且逻辑性强,非常适合执行逻辑和算术运算。 通过学习数制...
在C#中,每种进制都有特定的前缀来标识:二进制用`0b`或`0B`,八进制用`0`,十六进制用`0x`或`0X`。 二、内置方法 1. `int.Parse()` 和 `int.TryParse()` 这两个方法用于将字符串转换为十进制整数,可以指定基数...
在C++中进行任意进制转换,不仅可以帮助我们理解数字系统的本质,还能在实际编程问题中起到关键作用,比如处理二进制数据、网络通信或者编码解码等场景。下面将详细阐述C++中如何实现任意进制转换,并结合C++的基础...
总的来说,"ascii_to_mri.rar"这个压缩包提供了一个实用的工具,它利用C++和C的编程能力,解决了MRI数据从ASCII到二进制的转换问题,这对于医学研究和临床诊断具有重要的意义。通过理解这段源代码的工作原理,我们...
综上所述,返回式动态二进制搜索算法作为一种高效的防碰撞算法,能够有效地解决RFID系统中的碰撞问题,从而提高系统的运行效率和识别速度。它充分利用了已识别信息和碰撞信息,将数据分为两部分传输,减少了数据传输...
7. **逻辑运算**:在理解进制的基础上,还需要掌握基本的逻辑运算,如AND(与)、OR(或)、NOT(非)、XOR(异或),这些运算是计算机处理数据的基本操作。 8. **教学策略**:教师通过讲授、练习、总结和评价的...
在实际应用中,无限伯努利混合模型可以帮助识别二进制数据中的隐藏模式,例如在用户行为、传感器信号或文本分类等场景中。MATLAB作为一种广泛使用的数值计算和数据分析平台,提供了方便的矩阵运算和可视化工具,使得...
在计算机科学中,我们通常使用二进制(0和1)、八进制(0-7)、十进制(0-9)和十六进制(0-9和A-F)来表示数字。不同的进制是基于不同的基数系统,例如,十进制是基于10的,二进制是基于2的。进行进制转换是将一个...
通过对这个通用十六进制转换模块的学习和实践,开发者不仅可以掌握易语言的编程技术,还能深入理解进制转换的原理,这对于提升编程能力和解决实际问题非常有帮助。同时,这样的模块也可以作为其他易语言项目的组件,...
在这些技术中,最重要的方法是二进制决策图(BDD)技术的应用。BDD最初是为了逻辑设计和验证而建立的数据结构。BDD在模拟电路分析中的应用具有以下特点: 1. 它是一种紧凑的数据结构,可以消除符号分析中的数据冗余...
在计算机中,所有的数据最终都会被转换成二进制形式存储,但为了方便人阅读和理解,通常会使用十进制或十六进制来表达。 这个转换器的工作原理可能是通过读取输入的十六进制字符串,然后逐个字符进行转换。每个十六...
八进制和十六进制则分别用3位和4位二进制数来表示,方便人类阅读和记忆。 4.1.1 数制 二进制数制由0和1组成,是最简单的计数系统,但却是计算机的基础。八进制数制使用0-7这八个符号,每个位代表3个二进制位;十六...
在实际的计算机系统中,为了方便处理,通常会使用十六进制(base-16)表示二进制数,因为它更紧凑且减少错误的可能性。 原码是直接将数值的二进制表示,包括符号位,0代表正,1代表负。例如,+7的原码是00000111,...