首页 > 其他分享 >位运算

位运算

时间:2023-11-27 12:55:05浏览次数:34  
标签:运算 int lowbit eg 128 cpp

作用于整数类型的运算对象,对二进制数位进行运算。

位与:& 当且仅当两个运算对象都为1时,该位为1

1 & 1 = 1
1 & 0 = 0
0 & 1 = 0
0 & 0 = 0

eg: 255 & 128 = 128

位或:| 当且仅当两个运算对象都为0时,该位为0

1 | 1 = 1
1 | 0 = 1
0 | 1 = 1
0 | 0 = 0

eg: 255 | 128 = 255

位取反:~ 将1置为0,将0置为1

~ 1 = 0
~ 0 = 1

eg: ~ 128 = 127

位异或:^ 当且仅当两个运算对象中只一个为1时,该位为1

1 ^ 1 = 0
1 ^ 0 = 1
0 ^ 1 = 1
0 ^ 0 = 0

eg: 255 ^ 128 = 127

左移: <<

将一个运算对象的各二进制位全部左移若干位(左边的二进制位丢弃,右边补0)。

左边二进制位丢弃不包括1时, 左移1位相当于乘以2

eg: 3 << 2 = 12 (1100)

右移: >>

将一个数的各二进制位全部右移若干位,正数左补0,负数左补1,右边丢弃.

右移1位相当于除以2(整数除法)。

eg: 7 >> 1 变成 3,也就是111 >> 1 变成了 11。 

位运算的性质

  • x ^ x = 0 : 自己与自己做异或一定为0

  • x ^ 0 = x : 一个数与0做异或还是它本身

位运算的应用:

 Info

位运算的应用较多,写法种类也有多种。下面的应用,建议大家只是在本地都要运行一遍,加深记忆。

此外考场上难免会有不知道的位运算应用,这个时候,手算,对比,找规律,就是最好的方式。

  • 取末位(x & 1) 可用来判断奇数、偶数

  • 操作x的第j位(从右向左数,最右边是第0位)

cpp
x | (1 << j)  //将 x 的第 j 位设置为1
x & ~(1 << j) //将 x 的第 j 位设置为0
x ^ (1 << j)  //将 x 的第 j 位取反
(x >> j) & 1  //取 x 的第 j 位
  • 交换两个数: a ^= b ^= a ^= b;

  • lowbit 运算

cpp
int lowbit(int x) {
  // 计算 x 的二进制中,最低位的 1 以及后面所有 0 组成的数。
  // lowbit(0b01011000) == 0b00001000
  //          ~~~~^~~~
  // lowbit(0b01110010) == 0b00000010
  //          ~~~~~~^~
  return x & -x;  // CSP中考过lowbit另一种写法 x&(x^(x-1))
}
  • 计算1的个数
cpp
// 求 x 的二进制中1的个数
int popcount(int x) {
    int cnt = 0;
    while (x) {
        cnt++;
        x -= x & -x;
    }
    return cnt;
}
  • 枚举子集 给定n个元素,问这n个元素组成的每一个集合的所有子集。(n≤15)
cpp
for (int S=1; S<(1<<n); ++S){
    for (int S0=(S-1)&S; S0; S0=(S0-1)&S)
        //do something.
}

测试程序

这里给出一个可以用来直观展示位运算运算数和运算结果的程序,当你对位运算不熟悉的时候,可以拷贝这段代码,在本地稍加改造后运行。

cpp
#include <bits/stdc++.h>
using namespace std;
int f(int a, int b){	
	return a | (1 << b);
}
void otp(int x){
	for (int i = 31; i >= 0; i--) printf("%d", (x >> i) & 1);
}
int main(){
int a, b; scanf("%d%d", &a, &b);
  • 思考题:下面4种操作的含义是什么?
cpp
x & (x + 1); 
x & (x - 1);
x | (x + 1);
x | (x - 1);

标签:运算,int,lowbit,eg,128,cpp
From: https://www.cnblogs.com/luliusheng/p/17859004.html

相关文章

  • java基础学习:赋值运算符
    扩展的赋值运算符隐含了强制类型转换  packagecom.itheima.operator;publicclassQperator3{publicstaticvoidmain(String[]args){//目标:掌握扩展赋值运算符的使用//+=//需求类似于收红包doublea=9.5;dou......
  • verilog之“缩减运算符”
    reg[3:0] B;reg    C;assign C=&B;相当于:C=((B[0]&B[1])&B[2])&B[3];注:其他位运算符(~,|,^,&,^~)都有类似用法;   参考链接:verilog之“缩减运算符”-面包板社区(eet-china.com)  if(&b) sys_reset<=1'b0; else sys_reset<=......
  • 透析Java本质的36个话题02运算符与表达式
    1.莫衷一是——i+++j该如何计算?三个加号​ 在java中默认前面结合也就是(i++)+jinti=25;intj=2;intresult=i+++j;System.out.println(i);System.out.println(j);/*262*/贪心规则编译器的贪心规则,分析符号......
  • Java learning Day2 常量 变量 运算符 Scanner 方法 数组
    常量:字面值常量(直接写值的常量)+自定义常量变量:long型变量后必须加L;小数字面值常量默认double 若用float需加F;变量强转:小的会自动转成大的float虽然只有4个字节但是比所有整型的取值范围都大    浮点型有精度问题  表达式类型提升:如果表达式当中存在多种数......
  • 无涯教程-Linux - 运算符
    每个Shell支持各种运算符。我们将在本章中详细讨论Bourneshell(默认Shell)。我们现在将讨论以下运算符-算术运算符关系运算符布尔运算符字符串运算符BourneShell最初没有任何执行简单算术运算的机制,但它使用外部程序,即awk或expr。以下示例显示如何将两个数字相加-#......
  • 【luogu题解】T378828 位运算
    位运算题目背景题目由daiyulong20120222创作(me)并由QBW1117完善以及数据。题目描述给定两个数\(x,y\),在给定一个位运算符号\(c\)。请你列出\(x,y\)进行\(c\)位运算是的算数竖式式。注:竖式这么列:显示出两个数的完整二进制,包括前导零。32个'-'。显示出......
  • SQL 中的运算符与别名:使用示例和语法详解
    SQL中的IN运算符IN运算符允许您在WHERE子句中指定多个值,它是多个OR条件的简写。示例:获取您自己的SQLServer返回所有来自'Germany'、'France'或'UK'的客户:SELECT*FROMCustomersWHERECountryIN('Germany','France','UK');语法:SELECTcolumn_name(......
  • SQL 中的运算符与别名:使用示例和语法详解
    SQL中的IN运算符IN运算符允许您在WHERE子句中指定多个值,它是多个OR条件的简写。示例:获取您自己的SQLServer返回所有来自'Germany'、'France'或'UK'的客户:SELECT*FROMCustomersWHERECountryIN('Germany','France','UK');语法:SELECTcolumn_name(......
  • 【C++ Primer Plus】类、运算符重载、虚函数、友元函数模板
    1.运算符重载1.1普通运算符重载在类内重写operator+函数,实现加号运算符的重载,下面给出了两种调用方式,注意加号前为调用者,加号后为参数,第三行代码的完整写法实际上是第四行TimeTime::operator+(intminutes)const;Timetime;Timetime2=time+50;Timetime3=time.o......
  • MATLAB中的集合运算
    ​ matlab里关于集合运算和二进制数的运算的函数intersect:集合交集ismember:是否集合中元素setdiff:集合差集setxor:集合异或(不在交集中的元素)union:两个集合的并unique:返回向量作为一个集合所有元素(去掉相同元素) 例如:a=[1,2,3,4,5,6,7,8,9];b=[1,4,6,9,12......