- 浏览: 135129 次
- 性别:
- 来自: 杭州
文章分类
- 全部博客 (84)
- Java (30)
- C/C++ (3)
- Linux (1)
- 数据库 (19)
- 搜索引擎 (1)
- 数据结构 (2)
- 杂七杂八 (4)
- WEB前端 (6)
- Spring (2)
- JavaScript (9)
- DHTMLX (3)
- 正则表达式 (1)
- JQuery (1)
- Report (2)
- PDF (2)
- Word (0)
- Excel (0)
- CSV (0)
- Test & QA (1)
- BI (Business Intelligence) (10)
- SQL (18)
- SAP Business Object (0)
- DataStage (3)
- CI (Continuous Integration) (1)
- Algorith (3)
- Portal (1)
- Struts (1)
- Oracle (9)
- MS SQL Server (3)
- Teradata (3)
- MySql (1)
- Data Warehouse (5)
- ETL (8)
【转载】一提起位运算,人们往往想到它的高效性,无论是嵌入式编程还是优化系统的核心代码,适当的运用位运算总是一种迷人的手段,或者当您求职的时候,在代码中写入 适当的位运算也会让您的程序增加一丝亮点,最初当我读《编程之美》求“1的数目”时,我才开始觉得位运算是如此之美,后来读到 《Hacker's Delight》,感慨到Henry S.Warren把位运算运用的如此神出鬼没,很多程序都十分精妙,我觉得在一个普通的程序中大量运用这样的代码的人简直是疯了!但掌握简单的位运算技巧 还是必要的,所以今天写这篇博文把我积累的一些位运算技巧分享给大家,这些技巧不会是如求“1的数目”的技巧,是最基本的一行位运算技巧 !
1.获得int型最大值
[cpp]
view plain
copy
- int getMaxInt(){
- return (1<<31) - 1; //2147483647, 由于优先级关系,括号不可省略
- }
另一种写法
[cpp]
view plain
copy
- int getMaxInt(){
- return -(1<<-1) - 1; //2147483647
- }
另一种写法
[cpp]
view plain
copy
- int getMaxInt(){
- return ~(1<<31); //2147483647
- }
C语言中不知道int占几个字节时候
[java]
view plain
copy
- int getMaxInt(){
- return ((unsigned int )- 1 ) >> 1 ; //2147483647
- }
2.获得int型最小值
[cpp]
view plain
copy
- int getMinInt(){
- return 1<<31; //-2147483648
- }
另一种写法
[cpp]
view plain
copy
- int getMinInt(){
- return 1 << -1; //-2147483648
- }
3.获得long类型的最大值
C语言版
[cpp]
view plain
copy
- long getMaxLong(){
- return ((unsigned long )-1) >> 1; //2147483647
- }
JAVA版
[java]
view plain
copy
- long getMaxLong(){
- return (( long ) 1 << 127 )- 1 ; //9223372036854775807
- }
4.乘以2运算
[cpp]
view plain
copy
- int mulTwo( int n){ //计算n*2
- return n<<1;
- }
5.除以2运算
[cpp]
view plain
copy
- int divTwo( int n){ //负奇数的运算不可用
- return n>>1; //除以2
- }
6.乘以2的m次方
[cpp]
view plain
copy
- int mulTwoPower( int n, int m){ //计算n*(2^m)
- return n<<m;
- }
7.除以2的m次方
[cpp]
view plain
copy
- int divTwoPower( int n, int m){ //计算n/(2^m)
- return n>>m;
- }
8.判断一个数的奇偶性
[java]
view plain
copy
- boolean isOddNumber( int n){
- return (n & 1 ) == 1 ;
- }
9.不用临时变量交换两个数(面试常考)
C语言 版
[cpp]
view plain
copy
- void swap( int *a, int *b){
- (*a)^=(*b)^=(*a)^=(*b);
- }
通用版(一些语言中得分开写)
[java]
view plain
copy
- a ^= b;
- b ^= a;
- a ^= b;
1 0.取绝对值(某些机器上 , 效率比n>0 ? n:-n 高)
[cpp]
view plain
copy
- int abs( int n){
- return (n ^ (n >> 31)) - (n >> 31);
- /* n>>31 取得n的符号,若n为正数,n>>31等于0,若n为负数,n>>31等于-1
- 若n为正数 n^0=0,数不变,若n为负数有n^-1 需要计算n和-1的补码,然后进行异或运算,
- 结果n变号并且为n的绝对值减1,再减去-1就是绝对值 */
- }
11.取两个数的最大值(某些机器上, 效率比a>b ? a:b高)
通用版
[cpp]
view plain
copy
- int max( int a, int b){
- return b&((a-b)>>31) | a&(~(a-b)>>31);
- /*如果a>=b,(a-b)>>31为0,否则为-1*/
- }
C语言版
[cpp]
view plain
copy
- int max( int x, int y){
- return x ^ ((x ^ y) & -(x < y));
- /*如果x<y x<y返回1,否则返回0,
- 、 与0做与运算结果为0,与-1做与运算结果不变*/
- }
12.取两个数的最小值(某些机器上, 效率比a>b ? b:a高)
通用版
[cpp]
view plain
copy
- int min( int a, int b){
- return a&((a-b)>>31) | b&(~(a-b)>>31);
- /*如果a>=b,(a-b)>>31为0,否则为-1*/
- }
C语言版
[cpp]
view plain
copy
- int min( int x, int y){
- return y ^ ((x ^ y) & -(x < y));
- /*如果x<y x<y返回1,否则返回0,
- 与0做与运算结果为0,与-1做与运算结果不变*/
- }
13.判断符号是否相同
[java]
view plain
copy
- boolean isSameSign( int x, int y){
- return (x ^ y) > 0 ; // true 表示 x和y有相同的符号, false表示x,y有相反的符号。
- }
14.计算2的n次方
[cpp]
view plain
copy
- int getFactorialofTwo( int n){ //n > 0
- return 2<<(n-1); //2的n次方
- }
15.判断一个数是不是2的幂
[java]
view plain
copy
- boolean isFactorialofTwo( int n){
- return (n & (n - 1 )) == 0 ;
- /*如果是2的幂,n一定是100... n-1就是1111....
- 所以做与运算结果为0*/
- }
16.对2的n次方取余
[java]
view plain
copy
- int quyu( int m, int n){ //n为2的次方
- return m & (n - 1 );
- /*如果是2的幂,n一定是100... n-1就是1111....
- 所以做与运算结果保留m在n范围的非0的位*/
- }
17.求两个整数的平均值
[java]
view plain
copy
- int getAverage( int x, int y){
- return (x+y) >> 1 ;
- }
另一种写法
[java]
view plain
copy
- int getAverage( int x, int y){
- return ((x^y) >> 1 ) + (x&y);
- /*(x^y) >> 1得到x,y其中一个为1的位并除以2,
- x&y得到x,y都为1的部分,加一起就是平均数了*/
- }
下面是三个最基本对二进制位的操作
18.从低位到高位,取n的第m位
[java]
view plain
copy
- int getBit( int n, int m){
- return (n >> (m- 1 )) & 1 ;
- }
19.从低位到高位.将n的第m位置1
[java]
view plain
copy
- int setBitToOne( int n, int m){
- return n | ( 1 <<(m- 1 ));
- /*将1左移m-1位找到第m位,得到000...1...000
- n在和这个数做或运算*/
- }
20.从低位到高位,将n的第m位置0
[java]
view plain
copy
- int setBitToZero( int n, int m){
- return n & ~( 1 <<(m- 1 ));
- /* 将1左移m-1位找到第m位,取反后变成111...0...1111
- n再和这个数做与运算*/
- }
另附一些对程序效率上没有实质提高的位运算技巧,一些也是位运算的常识(面试也许会遇到)
计算n+1
[cpp]
view plain
copy
- -~n
计算n-1
[cpp]
view plain
copy
- ~-n
取相反数
[java]
view plain
copy
- ~n + 1 ;
另一种写法
[java]
view plain
copy
- (n ^ - 1 ) + 1 ;
if(x == a) x = b; if(x == b) x = a;
[cpp]
view plain
copy
- x = a ^ b ^ x;
sign函数,参数为n,当n>0时候返回1,n<0时返回-1,n=0时返回0
[cpp]
view plain
copy
- return !!n - (((unsigned)n>>31)<<1);
发表评论
-
java导出csv用excel打开后数字不用科学计数法显示
2011-08-15 14:27 22154最近写了一个生成csv的程序,生成的csv其中有一列数字长度 ... -
java生成xml文件的时候如何控制xml的缩进格式
2011-07-26 16:22 1137使用java自带的xml api生 ... -
java读取配置文件的几种方法
2011-07-21 12:17 748java读取配置文件的几种方法 在现实工 ... -
正则表达式语法
2011-07-18 10:52 726一个正则表达式就是 ... -
CSDN上看到的一篇有关Spring JDBC事务管理的文章(内容比较全)
2011-07-08 16:18 1100JDBC事务管理 Spring提供编程式的事务管理(Progr ... -
Spring:JdbcTemplate使用指南
2011-07-07 21:35 1027前言: 本文指在介绍 Spring 框架 ... -
Java DATE 工具类
2011-07-05 12:18 2402public class DateUtil { / ... -
java中取小数点后两位(四种方法)
2011-07-01 16:33 1811一 Long是长整型,怎么有小数,是double吧 ... -
Java正则表达式(一)
2011-06-30 20:14 867正则表达式在处理文本方面用处非常大,最早像在Perl和awk语 ... -
Java正则表达式(二)
2011-06-30 20:13 1005Matcher类: 使用Matcher类,最重要的一个概念必须 ... -
DBUnit入门
2011-04-28 15:55 794相信做过单元测试的人都会对JUnit非常的熟悉了,今天要介绍的 ... -
一些经典算法题目
2011-02-03 21:28 8931.写一个方法,用一个fo ... -
求最大子序列和问题的最优算法
2010-12-17 19:42 884//求最大子序列和问题, public class ... -
Java UDP通信(DatagramPacket类、DatagramSocket类、InetAddress类)
2010-11-30 22:16 1489一、DatagramPacket类: 如果把Datagram ... -
各种排序算法的稳定性和时间复杂度小结
2010-11-07 19:33 783选择排序、快速排序、 ... -
Java向服务器发送POST请求
2010-10-30 19:06 2438public String sendToServer(Stri ... -
Java发送Http请求,解析html返回
2010-10-30 18:53 2060首先,向一个Web站点发送POST请求只需要简单的几步: 注 ... -
Struts1和Struts2的区别和对比
2010-10-30 13:23 8731.Action 类: • Struts1要求Action类 ... -
java.net.URL的URL构建方式
2010-10-30 13:21 879Tag:java.net.URL URL构建方式 ... -
Vector遍历的通用实现
2010-10-27 19:53 1597对于Vector,如果我们不用遍历,那么就要自己去写循环,也是 ...
相关推荐
以下是一些关于位运算的基本技巧,对于任何想要提升编程技能,尤其是成为优秀程序员的人来说,这些都是非常实用的知识点。 1. **获取int型最大值**: - `(1) - 1`:这种方法通过左移1位并减1得到2的31次方减1,即...
这份资料涵盖了广泛的Java基础知识,包括语言特性、编程规范、面试技巧等多个方面。以下是一些核心知识点的详细解释: 1. **Java基础部分** - 一个`.java`源文件可以包含多个类,但只能有一个公共类(public class...
本书结构清晰,讲解透彻,是各高校相关专业C语言课程很好的教学参考书,也是各层次C程序员的优秀实践指南。 全球C语言程序员集体智慧的结晶;Amazon全五星图书;权威解答495个最常遇到的C语言问题。C是一门简洁...
《你必须知道的495个C语言问题》结构清晰,讲解透彻,是各高校相关专业C语言课程很好的教学参考书,也是各层次C程序员的优秀实践指南。 -----------------------------------------------------------------------...
首先,我们来了解【程序1】,这是一个关于数字排列组合的示例,要求生成所有可能的三位数,其中每个数字(1, 2, 3, 4)在百位、十位、个位各出现一次,且不得重复。这个练习很好地说明了如何在C语言中通过三重循环...
在讨论MCS-51单片机时,不得不提到其具有32条I/O线的引脚设计。这些I/O线可作为地址总线或数据总线,具体使用情况取决于不同的工作模式。P0口和P2口可分别用作地址总线的低8位和高8位,以及8位数据总线,这一特性...
在实现这个功能时,学习者将不得不处理日期逻辑以及闰年的判断。程序通过累加前几个月的天数,并对2月进行特殊处理(考虑到闰年的情况),最终计算出结果。这个例子很好地演示了C语言在处理实际问题时的逻辑思维和...
在MIPS64架构中,处理器的寄存器文件包括32个通用寄存器,这些寄存器不仅用于存储运算过程中的中间结果,也是函数调用参数传递和返回值的主要载体。此外,MIPS64架构还支持浮点运算的寄存器,它们为浮点数的运算提供...
它由26个英文字母(大小写)、数字(0-9)以及下划线(_)和美元符号($)组成,但数字不能作为开头,且不得使用Java的关键字。 3. 注释: 注释是用来解释代码功能的文字,对编译器无效。Java中的注释主要有三种...
第三章 编写第一个应用程序 .20 3.1 Welcome 程序 .20 3.2 代 码 分 析 .20 3.3 运 行 程 序 .23 .4 添 加 注 释 .25 3.5 小 结 .27 第二部分 C#程序设计基础.28 第四章 数 据 类 型 .28 4.1 值 类 型...
10. **版权和法律条款**:文档明确指出,未经ARM公司许可,不得复制或改编其中的信息,同时ARM不承担因使用文档信息或产品不当导致的任何损失或损害责任。 学习和掌握《ARMv7 汇编程序指南4.0版》的内容,开发者...
运算符包括算术运算符、关系运算符、逻辑运算符、位运算符等,它们用于执行各种运算。类型转换用于将一种数据类型转换成另一种数据类型。关键字是C++语言中具有特殊意义的词,如if、else、for、class等。预处理指令...
随着处理器技术的不断发展,计算机系统设计者和用户不得不面对更复杂的硬件结构,这促使他们采用并行计算模式以充分利用多核处理器的性能。书中详细介绍了并行计算的基本理论,包括不同类型的并行计算机架构、内存...
数据处理指令用于执行基本的算术和逻辑运算,如加减乘除、位操作等;分支指令则用于控制程序流程,如跳转、条件跳转等;加载/存储指令用于在寄存器和内存之间传输数据;浮点运算指令支持单精度和双精度浮点数的计算...
提到字符编码,就不得不提到ASCII码。ASCII码是美国信息交换标准代码的简称,它是一种西文字符的标准编码系统,可以表示英文中的大小写字母、数字和一些特殊符号。ASCII码是计算机早期发展中的一项关键技术,它实现...
- **字节(Byte)**:8个位构成一个字节。 - **数值系统转换**: - **二进制、八进制、十六进制转十进制**:通过乘法实现。 - **十进制转二进制、八进制、十六进制**:通过除法实现。 - **内存地址**:数据存储的...
程序员必须知道如何配置系统控制寄存器来实现这些功能,例如,通过设置NVIC(嵌套向量中断控制器)来管理中断。Cortex-M7提供了灵活的电源控制选项,允许系统在低功耗模式和性能模式之间切换,以满足不同应用场景的...
这些指令直接涉及处理器内部的算术逻辑单元(ALU),允许程序员进行算术运算。同时,逻辑指令如逻辑异或(EOR)、位清除(BIC)和逻辑或(ORR)等也被介绍,用于执行位级的操作,这对于处理信号和进行硬件级别的操作...