首页 > 其他分享 >位运算

位运算

时间:2023-10-21 15:57:24浏览次数:28  
标签:右移 __ 运算 int 二进制 bit2 bit1

位运算

Part1. 基础运算

 &     与     两个位都为1时,结果才为1                                                
 |     或     两个位都为0时,结果才为0                                            
 ^     异或    两个位相同为0,相异为1                                                  
 ~     取反    0变1,1变0                                                         
 <<    左移    各二进位全部左移若干位,高位丢弃,低位补0                                     
 >>    右移    各二进位全部右移若干位,对无符号数,高位补0,有符号数,各编译器处理方法不一样,有的补符号位(算术右移),有的补0(逻辑右移)

Part2. 混合运算

(n >> k) & 1   取 n 的第 k 位
n & ((1 << k) - 1)  取 n 的后 k 位
n ^ (1 << k)   将 n 的第 k 位取反
n | (1 << k)   将 n 的第 k 位改为 1
n & (~(1 << k)) 将 n 的第 k 位改为 0 

Part3. 其他函数

int __builtin_popcount(unsigned int x) :返回 x 的二进制中 1 的个数。

int __builtin_ffs(int x) :返回 x 的二进制末尾最后一个 1 的位置,位置的编号从 1 开始(最低位编号为 1 )。当 x0 时返回 0

int __builtin_clz(unsigned int x) :返回 x 的二进制的前导 0 的个数。当 x0 时,结果未定义。

int __builtin_ctz(unsigned int x) :返回 x 的二进制末尾连续 0 的个数。当 x0 时,结果未定义。

Part4. 例题

[NOI2014] 起床困难综合症

题目传送门

我们发现,直接找最大值必定 T 飞,考虑使用二进制。

那么对于这个题,二进制有点在于什么地方呢?

很显然,我们在十进制中,想让一个数最大,是不是先判断最高位,最高位最大就一定最大。在二进制中也是如此。而且二进制一个位上就两种可能,要么是一要么是零。

我们可以随便搞两个变量记录二进制全 \(0\) 和全 \(1\) 经过门之后的样子。

然后从最高位开始找就可以了。

注释代码:

#include<bits/stdc++.h>

#define rint register int
#define endl '\n'
#define int long long

using namespace std;

const int N = 1e5 + 5;

int n, m;
int bit1 = 0, bit2 = -1;
//这两个数用来预处理,一个是全零,一个是全一
int ans;

signed main()
{
    cin >> n >> m;
    
    for (rint i = 1; i <= n; i++)
    {
		string s;
		int a;
		cin >> s >> a;
		if (s[0] == 'A')
		{
			bit1 &= a;
			bit2 &= a;
		}
		if (s[0] == 'O')
		{
			bit1 |= a;
			bit2 |= a;
		}
		if (s[0] == 'X')
		{
			bit1 ^= a;
			bit2 ^= a;
		}
	}
	
	//从最高位开始枚举
	for (rint i = 32; i >= 0; i--)
	{
		if ((bit1 >> i) & 1)
		/*
		如果对于当前位而言
		bit1 出来为 1
		累计答案
		*/
		{
			ans += (1ll << i);
		}
		else if ((bit2 >> i) & 1)
		{
			if((1ll << i) <= m)
			{
				m -= 1ll << i;
				ans += 1ll << i;
			}
		}
	}
	
	cout << ans << endl;
	
	return 0;
}

标签:右移,__,运算,int,二进制,bit2,bit1
From: https://www.cnblogs.com/spaceswalker/p/17779084.html

相关文章

  • 8.4 C++ 运算符重载
    C/C++语言是一种通用的编程语言,具有高效、灵活和可移植等特点。C语言主要用于系统编程,如操作系统、编译器、数据库等;C语言是C语言的扩展,增加了面向对象编程的特性,适用于大型软件系统、图形用户界面、嵌入式系统等。C/C++语言具有很高的效率和控制能力,但也需要开发人员自行管理内存......
  • 8.4 C++ 运算符重载
    C/C++语言是一种通用的编程语言,具有高效、灵活和可移植等特点。C语言主要用于系统编程,如操作系统、编译器、数据库等;C语言是C语言的扩展,增加了面向对象编程的特性,适用于大型软件系统、图形用户界面、嵌入式系统等。C/C++语言具有很高的效率和控制能力,但也需要开发人员自行管理内存......
  • JavaScript 运算符
     算术运算符简表运算符描述例子x的运算结果y的运算结果在线实例(来源runoob.com)+加法x=y+275实例>>-减法x=y-235实例>>*乘法x=y*2105实例>>/除法x=y/22.55实例>>%取余数(模)x=y%215实例>>++ 自......
  • C语言 运算符
    大家好,欢迎来大家参考我的文章,学习任何一门语言都非常需要强大的实践能力,理论知识,学习C语言是个很漫长的过程,学习到后面还需要算法数据结构的支撑,再到后面大家就可以尝试一些比赛:蓝桥杯...检验自己的实力,这是我的第二篇文章,我呢一直在以白话文方式,少使用编程语言术语,让更好理解C语......
  • 栈实现算术优先级运算c++
    #include<stdlib.h>#include<stdio.h>#include<iostream>usingnamespacestd;#defineSTACK_INIT_SIZE100//栈初始开辟空间大小#defineSTACK_INCREMENT10//栈追加空间大小//优先级数组,2表示top>c,1表示top<c,0表示top=c,-1表示错误intprior[7][7]={{2,2,......
  • 基本运算
    基本运算一、算术运算符x=10y=20print(x+y)#30print(x-y)#-10print(x*y)#200print(x/y)#0.5print(x%y)#10print(x//y)#0print(x**y)#100000000000000000000二、比较运算符​ 返回的都是布尔值x=10y=20print(x>y)......
  • 【从零学习python 】05. Python中运用算数运算符进行计算和字符串拼接
    进制现代的计算机和依赖计算机的设备里都用到二进制(即0和1)来保存和表示数据,一个二进制表示一个比特(Bit)。在二进制的基础上,计算机还支持八进制和十六进制这两种进制。除了计算机里的进制以外,我们生活中经常用到的是十进制。Python语言支持二进制、八进制、十六进制以......
  • 【从零学习python 】05. Python中运用算数运算符进行计算和字符串拼接
    进制现代的计算机和依赖计算机的设备里都用到二进制(即0和1)来保存和表示数据,一个二进制表示一个比特(Bit)。在二进制的基础上,计算机还支持八进制和十六进制这两种进制。除了计算机里的进制以外,我们生活中经常用到的是十进制。Python语言支持二进制、八进制、十六进制以......
  • 【从零学习python 】05. Python中运用算数运算符进行计算和字符串拼接
    进制现代的计算机和依赖计算机的设备里都用到二进制(即0和1)来保存和表示数据,一个二进制表示一个比特(Bit)。在二进制的基础上,计算机还支持八进制和十六进制这两种进制。除了计算机里的进制以外,我们生活中经常用到的是十进制。Python语言支持二进制、八进制、十六进制以......
  • 运算符重载
    运算符重载1概述C++规定运算符重载必须针对类的对象,即重载时至少有一个参数是对象,如A、constA、A&等等。没有对象就new一个出来。C++用operator加运算符进行。对于普通运算符成员函数,this隐含参数代表第一个操作数对象。运算符可分为:不能重载:sizeof、.、.*、::、?:只能重......