『你不知道的位运算,原来还可以这么用』

一、计算一个数的二进制表示中1的个数

一个十进制数字减1后,它的最低位的1位置变为0,下一个位置变为1,所以把它的最低位的1变为0.(比如:数字6的二进制表示是00000110,数字5的二进制表示是00000101,进行一次操作,两个数字按位相与之后就变为00000100,数字6的二进制表示中1的个数就减少一个)

int countOf_1(int num){
    int ans = 0;
    while(num){
        num &= num - 1;
        ans++;
    }
    return ans;
}

二、判断一个数是不是2的n次方

判断一个数是不是2的n次方,即判断一个数的二进制位的最高位是不是1,且只有一个

bool is_2Power(int num){
    num &= num - 1;
    return num == 0;
}

三、整数n可以经过多少次变化变成m(指改变多少二进制位)

int countChange(int n, int m){
    return countOf_1(n ^ m);//调用第一个函数
}

四、获得最大、最小的int值

pair<int, int> getLimitInt(){
    pair<int, int> p;
    p.first = ~(1 << 31);//int最大值
    p.second = 1 << 31;//int最小值
    return p;
}

五、判断一个数的奇偶性

判断一个数是否为奇数即判断一个数的二进制表示中最低位是否为1

bool isOdd(int num){
    return num & 1 == 1;
}

六、交换两个数的值

十进制中交换两个数a, b的值可以这样:a = a + b; b = a - b; a = a - b; 类似,二进制中可以用异或操作:a = a ^ b; b = a ^ b; a = a ^ b;

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

七、求两个数的平均值

int getAverage(int m, int n){
    return (m + n) >> 1;
}

八、求倒数第m位的值

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

九、把倒数第m位设置为1

void setMthN_1(int n, int m){
    n |= (1 << (m - 1));
    return ;
}

十、把倒数第m位设置为0

void setMthN_0(int n, int m){
    n &= ~(1 << (m - 1));
    return ;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-11 13:19:11

『你不知道的位运算,原来还可以这么用』的相关文章

N皇后问题(位运算实现)

本文参考Matrix67的位运算相关的博文. 顺道列出Matrix67的位运算及其使用技巧 (一) (二) (三) (四),很不错的文章,非常值得一看. 主要就其中的N皇后问题,给出C++位运算实现版本以及注释分析. 皇后问题很经典,就不再赘述问题本身,解决皇后问题,一般采用的都是深搜DFS+回溯的方法,按照行(列)的顺序枚举每一个可以放置的情况,然后进行冲突判断,当前的放置是否合法,合法就继续搜索下一层,不合法就搜索就回溯.直到,找到一个合法的解,每一层都有一个皇后并且不发生冲突,这时候,放置

nyist oj 138 找球号(二)(hash 表+位运算)

找球号(二) 时间限制:1000 ms  |  内存限制:65535 KB 难度:5 描述 在某一国度里流行着一种游戏.游戏规则为:现有一堆球中,每个球上都有一个整数编号i(0<=i<=100000000),编号可重复,还有一个空箱子,现在有两种动作:一种是"ADD",表示向空箱子里放m(0<m<=100)个球,另一种是"QUERY",表示说出M(0<M<=100)个随机整数ki(0<=ki<=100000100),分

[leetcode] Sum of Two Integers--用位运算实现加法运算

问题: Calculate the sum of two integers a and b, but you are not allowed to use the operator + and -. Example: Given a = 1 and b = 2, return 3. 分析: 这里要求我们不能用加法.减法等运算符来实现加法运算.这里应该使用位运算来实现加法运算,实际上,这也是计算机CPU内部实现加法运算的方案. x XOR y真值表: x y output 0 0 0 0 1 1

mysql位运算的应用

在mysql中,如果某条数据与其它数据存在一对多的关系,一般我们很自然的就会想到建立一个关系表.例如有一个景点信息的数据表,其结构如下: id int(主键) name varchar(景点名) province int(省份) city int(城市) 每个景点包含很多属性,例如适合旅游的月份,我们一般的做法可能有两种:一种是增加一个varchar字段,每个月份之间用一个特殊符号分隔保存,例如“1,2,3,11,12”:另一种方法是建立一个关系表,如下: spots_id int(景点ID)

状态压缩中常用的位运算(DP)

面对位运算,一直很无感...可能数学太差,脑洞太小. 1.首先是最基本的: 与&,或|,非~,异或^. 2.获取一个或者多个固定位的值: 假设 x = 1010(二进制),我们要取左数第二位的值,可以用(x &(1<<1)); 还可用(x&(3<<2))来取得第三位和第四位. 3.把一个或者多个固定的位上的值清零: 同样 x = 1010(二进制),我们要使左数第二位的值清零,可以用(x^(1<<1)). 待续..

【模拟+递归+位运算】POJ1753-Flip Game

由于数据规模不大,利用爆搜即可.第一次用位运算写的,但是转念一想应该用递归更加快,因为位运算没有剪枝啊(qДq ) [思路] 位运算:时间效率较低(172MS),有些辜负了位运算的初衷.首先将二维数组倒序看作一个二进制数num.我们假设1代表翻转,0代表不翻转,可以发现以下规律:0 xor 1=1,1 xor 1=0;0 xor 0=0,1 xor 0=1,恰巧满足异或运算.我们假设另一个二进制数i∈[0,2^16),通过异或运算就可以模拟出所有清形. 用check和i进行&操作可以求出以哪些位

位运算(&amp;amp;、|、^)与逻辑运算(&amp;amp;&amp;amp;、 ||)差别

刚无意在一篇文章中看到了位运算(&.|)和逻辑运算(&&.||)的介绍.想起了自己薄弱的基础知识.于是百度了几把总结了下. 首先从概念上区分下,位运算是将运算符两边的数字换算成二进制(例:0000010001)后比較同样位置上的0.1进行运算的.逻辑运算即比較运算符两边的逻辑值(true或false).概念比較抽象.下边借助实际样例比較下. 位运算 先将每一个数转换成二进制.然后进行.位或(|)表示相相应的每位至少有一个为1.则结果为1,仅仅有两个都为0.结果才为0.位与(&

C语言原码反码补码与位运算.

目录: 一.机器数和真值     二.原码,反码和补码的基础概念     三.为什么要使用原码,反码和补码     四.原码,补码,反码再深入     五.数据溢出测试     六.位运算的运算说明     七.位运算的简单应用   一.机器数和真值 机器数(computer number)是数字在计算机中的二进制表示形式 机器数有2个特点:一是符号数字化,二是其数的大小受机器字长的限制 比如:十进制中的+6,计算机字长为8位,转换成二进制就是00000110,如果是-6,就是10000110

位运算之——按位与(&amp;)操作——(快速取模算法)

由于位运算直接对内存数据进行操作,不需要转成十进制,因此处理速度非常快. 按位与(Bitwise AND),运算符号为& a&b 的操作的结果:a.b中对应位同时为1,则对应结果位也为1. 例如: 10010001101000101011001111000 & 111111100000000 --------------------------------------------- 10101100000000 对10101100000000进行右移8位得到的是101011,这就得