- 浏览: 130657 次
- 性别:
- 来自: 杭州
文章分类
- 全部博客 (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 21899最近写了一个生成csv的程序,生成的csv其中有一列数字长度 ... -
java生成xml文件的时候如何控制xml的缩进格式
2011-07-26 16:22 1080使用java自带的xml api生 ... -
java读取配置文件的几种方法
2011-07-21 12:17 710java读取配置文件的几种方法 在现实工 ... -
正则表达式语法
2011-07-18 10:52 685一个正则表达式就是 ... -
CSDN上看到的一篇有关Spring JDBC事务管理的文章(内容比较全)
2011-07-08 16:18 1064JDBC事务管理 Spring提供编程式的事务管理(Progr ... -
Spring:JdbcTemplate使用指南
2011-07-07 21:35 977前言: 本文指在介绍 Spring 框架 ... -
Java DATE 工具类
2011-07-05 12:18 2353public class DateUtil { / ... -
java中取小数点后两位(四种方法)
2011-07-01 16:33 1766一 Long是长整型,怎么有小数,是double吧 ... -
Java正则表达式(一)
2011-06-30 20:14 825正则表达式在处理文本方面用处非常大,最早像在Perl和awk语 ... -
Java正则表达式(二)
2011-06-30 20:13 956Matcher类: 使用Matcher类,最重要的一个概念必须 ... -
DBUnit入门
2011-04-28 15:55 754相信做过单元测试的人都会对JUnit非常的熟悉了,今天要介绍的 ... -
一些经典算法题目
2011-02-03 21:28 8551.写一个方法,用一个fo ... -
求最大子序列和问题的最优算法
2010-12-17 19:42 841//求最大子序列和问题, public class ... -
Java UDP通信(DatagramPacket类、DatagramSocket类、InetAddress类)
2010-11-30 22:16 1443一、DatagramPacket类: 如果把Datagram ... -
各种排序算法的稳定性和时间复杂度小结
2010-11-07 19:33 741选择排序、快速排序、 ... -
Java向服务器发送POST请求
2010-10-30 19:06 2395public String sendToServer(Stri ... -
Java发送Http请求,解析html返回
2010-10-30 18:53 1999首先,向一个Web站点发送POST请求只需要简单的几步: 注 ... -
Struts1和Struts2的区别和对比
2010-10-30 13:23 8201.Action 类: • Struts1要求Action类 ... -
java.net.URL的URL构建方式
2010-10-30 13:21 840Tag:java.net.URL URL构建方式 ... -
Vector遍历的通用实现
2010-10-27 19:53 1532对于Vector,如果我们不用遍历,那么就要自己去写循环,也是 ...
相关推荐
掌握简单的位运算技巧还是必要的,所以今天写这篇文章把我积累的一些位运算技巧分享给大家,这些技巧不会是如求“1的数目”的技巧,是最基本的一行位运算技巧
优秀程序员的十个习惯
程序员不得不知道的 API 接口常识.doc
优秀程序员之路 Java开发经验及技巧大汇总优秀程序员之路 Java开发经验及技巧大汇总优秀程序员之路 Java开发经验及技巧大汇总优秀程序员之路 Java开发经验及技巧大汇总优秀程序员之路 Java开发经验及技巧大汇总优秀...
成为优秀程序员的 101 个技巧
优秀程序员之路——C# 开发经验及技巧大汇总.rar
Java程序员必须知道的10个调试技巧,适合有一定经验的程序员调试,对于初学者有帮助
word文档关于程序员的习惯 如何成为优秀程序员的方法
优秀程序员必须知道的32个算法
波波-程序员不得不知道的SpringBoot的那些事儿.mp4
程序员都应该知道的MYSQL秘籍程序员都应该知道的MYSQL秘籍程序员都应该知道的MYSQL秘籍程序员都应该知道的MYSQL秘籍程序员都应该知道的MYSQL秘籍程序员都应该知道的MYSQL秘籍程序员都应该知道的MYSQL秘籍程序员都...
优秀程序员需要具备的习惯,如果能够达到以上要求,it界必然有你一席之地。
本文档主要是介绍老鸟程序员才知道的 40 个小技巧,重点在于提高程序员的能力!仅供参考!
每个程序员都会的35种小技巧,干货推荐,每个程序员都会的35个jQuery小技巧!
[12]优秀程序员之路——C++开发经验及技巧大汇总.zip上位机开发VC串口学习资料源码下载[12]优秀程序员之路——C++开发经验及技巧大汇总.zip上位机开发VC串口学习资料源码下载[12]优秀程序员之路——C++开发经验及...
计算机软考初级程序员-计算机基础-CPU-运算器
优秀程序员之路—Csharp开发经验及技巧汇总.pdf
为啥成为一个优秀的程序员,作者列数一百条准则