必用位运算

引述:

  • 使用位运算的两个优点 : 简单,效率高(计算机底层)
  • 简单记忆 : 清零取反用与,位置一用或 ,交换用疑惑

参考: url

1.获得int型最大值

int getMaxInt(){
        return (1 << 31) - 1;//2147483647, 由于优先级关系,括号不可省略
}  

1.1另一种写法

int getMaxInt(){
    return ~(1 << 31);//2147483647
}  

2.获得int型最小值

int getMinInt(){
    return 1 << 31;//-2147483648
 }  

2.1另一种写法

int getMinInt(){//有些编译器不适用
    return 1 << -1;//-2147483648
}

3.获得long类型的最大值

C语言版

long getMaxLong(){
    return ((unsigned long) - 1) >> 1;//2147483647
}  

获得long最小值,和其他类型的最大值,最小值同理.

4.乘以2运算

int mulTwo(int n){//计算n*2
    return n << 1;  //左移一位
} 

5.除以2运算

int divTwo(int n){//负奇数的运算不可用
    return n >> 1;//除以2  右移一位
} 

6.乘以2的m次方

int mulTwoPower(int n,int m){//计算n*(2^m)
    return n << m;
}

7.除以2的m次方

int divTwoPower(int n,int m){//计算n/(2^m)
    return n >> m;
} 

8.判断一个数的奇偶性

boolean isOddNumber(int n){
    return (n & 1) == 1;
} 
  1. swap 疑惑实现

    void swap(int *a,int *b){
    (*a) ^= (*b) ^= (*a) ^= (*b);
    } 

    10.取绝对值(某些机器上,效率比n>0 ? n:-n 高)

    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就是绝对值 */
    } 
  2. 取最大值MAX
int max(int x,int y){
    return x ^ ((x ^ y) & -(x < y));
    /*如果x<y x<y返回1,否则返回0,
、 与0做与运算结果为0,与-1做与运算结果不变*/
} 

12.判断一个数是不是2的幂

boolean isFactorialofTwo(int n){
    return n > 0 ? (n & (n - 1)) == 0 : false;
    /*如果是2的幂,n一定是100... n-1就是1111....
       所以做与运算结果为0*/
}

13.从低位到高位,取n的第m位

int getBit(int n, int m){
    return (n >> (m-1)) & 1;
}  

14.从低位到高位.将n的第m位置1

int setBitToOne(int n, int m){
    return n | (1 << (m-1));
    /*将1左移m-1位找到第m位,得到000...1...000
      n在和这个数做或运算*/
}  

15.从低位到高位,将n的第m位置0

int setBitToZero(int n, int m){
    return n & ~(1 << (m-1));
    /* 将1左移m-1位找到第m位,取反后变成111...0...1111
       n再和这个数做与运算*/
}

原文地址:https://www.cnblogs.com/dgwblog/p/8904147.html

时间: 2024-10-15 01:13:50

必用位运算的相关文章

位运算必会20个

优秀程序员不得不知道的20个位运算技巧 一提起位运算,人们往往想到它的高效性,无论是嵌入式编程还是优化系统的核心代码,适当的运用位运算总是一种迷人的手段,或者当您求职的时候,在代码中写入适当的位运算也会让您的程序增加一丝亮点,最初当我读<编程之美>求"1的数目"时,我才开始觉得位运算是如此之美,后来读到 <Hacker's Delight>,感慨到Henry S.Warren把位运算运用的如此神出鬼没,很多程序都十分精妙,我觉得在一个普通的程序中大量运用这样的代

事件扩展修饰符与位运算

今天查看别人重写的鼠标拖动事件的源码时,有一段代码很不解 1 public void mouseDragged(MouseEvent e) { 2 form.setCursor(mc); 3 if ((e.getModifiersEx() & MouseEvent.BUTTON1_DOWN_MASK) != 0) 4 form.setLocation(e.getXOnScreen() - this.x, e.getYOnScreen() 5 - this.y); 6 } 这里(e.getModi

HDU 4317 位运算

[题意]: 在一个常规的NIM游戏里,你可以在每堆石子拿走任意数量的石子,问求使先手必败的情况下拿走石子数量的最小值. [知识点]: 位运算,DP [题解]: 一道精致的位运算的好题目,细节有不少. 具体解释在代码内. [代码]: 1 #include <iostream> 2 #include <cstring> 3 #include <cstdio> 4 #include <cmath> 5 #include <cstdlib> 6 #inc

位运算

位运算的实际应用场景 http://blog.csdn.net/zmazon/article/details/8262185

POJ 1781 In Danger Joseph环 位运算解法

Joseph环,这次模固定是2.假设不是固定模2,那么一般时间效率是O(n).可是这次由于固定模2,那么能够利用2的特殊性,把时间效率提高到O(1). 规律能够看下图: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQva2VuZGVuMjM=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" > 具体具体解析请看大师Knuth的Concrete m

位运算总结&amp;拾遗

JavaScript 位运算总结&拾遗 最近补充了一些位运算的知识,深感位运算的博大精深,此文作为这个系列的总结篇,在此回顾下所学的位运算知识和应用,同时也补充下前文中没有提到的一些位运算知识. 把一个数变为大于等于该数的最小的2的幂 一个数为2的幂,那么该数的二进制码只有最高位是1. 根据这个性质,我们来举个栗子,比如有数字10,转为二进制码后为: 1 0 1 0 我们只需把 0 bit的位置全部用1填充,然后再把该二进制码加1就ok了.而x | (x + 1)正好可以把最右边的0置为1,可是

Java I/O : Bit Operation 位运算

Writer      :BYSocket(泥沙砖瓦浆木匠) 微         博:BYSocket 豆         瓣:BYSocket FaceBook:BYSocket Twitter    :BYSocket 泥瓦匠喜欢Java,文章总是扯扯Java. I/O 基础,就是二进制,也就是Bit. 一.Bit与二进制 什么是Bit(位)呢?位是CPU处理或者数据存储最小的单元.类似于很小很小的开关,一开一关,表示为1或者0.所以,这就是计算机处理任何数据的"细胞",要谨记.

mysql位运算

1.MOD(X1,X2) 求余运算,返回余数同"%" 2.X1 DIV X2 除法运算返回商,同"/" 3.如果除数为0,那么结果为NULL. 4.<=>和= 是一样的,也是用来判断操作数是否相等的.不同的是<=>可以用来判断null,=不能判断null. 例:select null<=>null 结果1 逻辑运算符 1.与&&或and:所有操作数不为0且不为null时,结果为1,任何一操作数为0,结果为0,存在一

位运算之 C 与或非异或

位运算比较易混: 位运算之 C 与或非异或 与运算:& 两者都为1为1,否则为0 1&1=1,  1&0=0,  0&1=0,  0&0=0 或运算:| 两者都为0为0,否则为1 1|1 = 1,  1|0 = 1,  0|1 = 1, 0|0 = 0 非运算:~ 1取0,0取1 ~1 = 0, ~0 = 1 ~(10001) = 01110 异或运算:^ 两者相等为0,不等为1(易混淆) 1^1=0, 1^0=1, 0^1=1, 0^0=0 位移操作符:<&