【洛谷日报#26】GCC自带位运算系列函数
文章转自 洛谷
谈到GCC的黑科技,大家想到的一定是这句:
#pragma GCC optimize (3)//吸氧
抑或是这句:
#pragma GCC diagnostic error "-std=c++11"//C++11
然而又有多少人知道__builtin_xxx()
这群神奇的存在?
举个栗子:树状数组的核心思想就是一个叫做lowbit()
的函数,它是这样写的:
inline int lowbit(const int &x){
return x & -x;
}
什么,你说长?你嫌慢?
#define lowbit(x) ((x) & -(x))
什么,你还是不想自己写?非得用内置函数?
那么恭喜你,这是你新的出路:
lowbit(x) == (1 << __builtin_ctz(x))
当然,对于lowbit()
函数,大家看不到什么好处(喜欢这样用的才有问题吧(-_-))
再举一个栗子:P2704, 一道状压DP入门题目,它要求输出:
仅一行,包含一个整数K,表示最多能摆放的炮兵部队的数量。
那么,DP的时候,对于每一行的状态,若它在二进制下的第i
位以0
表示不放,以1
表示放的话,我们就得统计它二进制下1
的个数,于是考虑用一个inline
的函数count()
来统计:
inline int count(int x)//摘自本人AC代码
{
int ret = 0;
while(x)
{
ret += x & 1;
x >>= 1;
}
return ret;
}
统计一下,这里一共有135
字节的内容。
使用它的代码长这样:sum[tot] = count(i);
,改一下,变成这样:sum[tot] = __builtin_popcount(i);
有人又要钻牛角尖:就算你把函数定义的码量给省了,但是你每次调用函数都会增加strlen("__builtin_pop") == 13
字节的码量啊?
那还不简单define
下就好了
除了上述函数,本人另外还整理了一部分用得到的__builtin_
系列函数: - __builtin_ffs(x)
返回x
的二进制下第一位1
的位置(从1
开始) - __builtin_clz(x)
返回x
二进制下最高有效位到最高位的1
上一位的长度(即最高位开始连续0
的个数) - __builtin_ctz(x)
与上一个函数相反,返回x
的二进制下最低位开始连续0
的个数(即第一个函数 - 1) - __builtin_parity(x)
返回x
二进制下1
的个数的奇偶性 - __builtin_popcount(x)
返回x
二进制下1
的个数
另外以上函数的唯一参数都为unsigned int
类型,并且都有unsigned long long
版本,即在函数名后面加上ll
,Like __builtin_popcountll(x)
。
对于其他的__builtin_
系列函数,可以自行查阅GNU C
所提供的文档
又双叒叕及:感谢@ComeIntoPower 管理员大大普及:可以在程序开头加入这样一行:
#pragma GCC target ("popcnt")
根据大大的说法,这条GCC
指令可以让__builtin_popcount
被编译器识别为一条指令。
什么用呢?就是加速!时 间 减 半!它本身就够快了,还可以加速%%%,鄙人真是孤陋寡闻。
注意:有些计算机可能不支持popcnt
指令,然后GCC
就会GG
。(大部分计算机都有)
还有一点注意,有一种说法是NOI系列赛事中禁止使用以下划线开头的函数,因此在NOI系列比赛中使用有风险,这只是给平时做题提供一些便利
此外,既然是黑科技
自然有地方不给用,我已经测试了各大OJ
对于该系列函数的支持情况:(务必选用G++/GCC
作为编译器)
- 洛谷: OJBK
- Poj: OJBK
- Lydsy: OJBK
- Hdu: A+B 莫名WA,但是编译应该OJBK
- CodeVS: OJBK
- Vijos: OJBK
- Uoj: OJBK
- Codeforces: OJBK
- JoyOI: 评测机炸了,待更新
- ContestHunter: OJBK
- Zoj: 编译过了,也是莫名WA
- SPOJ: OJBK
- UVa: OJBK
- AtCoder: OJBK
- LibreOJ: OJBK
- 比赛: 这个请问官方
- ...待补充
【洛谷日报#26】GCC自带位运算系列函数的更多相关文章
- NOI2014 洛谷P2114 起床困难综合征(位运算)
呃...这道题算是noi中比较简单的题吧...... 众所周知,位运算是个好东西,它就是对应的位进行运算,跟其他的位没有关系. 我们要选取一个m值使最后的攻击力最大,对于这个m,从高位开始枚举,判断该 ...
- 【洛谷P2114】起床困难综合征 位运算+贪心
题目大意:给定 N 个操作,每个操作为按位与.或.异或一个固定的数字,现在要求从 0 到 M 中任选一个数字,使得依次经过 N 个操作后的值最大. 题解:位运算有一个重要的性质是:位运算时,无进位产生 ...
- 洛谷 P2114 [NOI2014]起床困难综合症 位运算
题目描述 21世纪,许多人得了一种奇怪的病:起床困难综合症,其临床表现为:起床难,起床后精神不佳.作为一名青春阳光好少年,atm一直坚持与起床困难综合症作斗争.通过研究相关文献,他找到了该病的发病原因 ...
- 洛谷P2114 起床困难综合症【位运算】【贪心】
题目:https://www.luogu.org/problemnew/show/P2114 题意:有n个操作,每个可以是与.或.异或 一个数. 初始值是0~m之间的一个数,问经过n个运算之后,可以得 ...
- 洛谷 1219:八皇后 (位运算 & DFS)
题目链接: https://www.luogu.org/problem/show?pid=1219#sub row:受上面的皇后通过列控制的位置 ld:受上面的皇后通过从右至左的斜对角线控制的位置 r ...
- [洛谷日报第62期]Splay简易教程 (转载)
本文发布于洛谷日报,特约作者:tiger0132 原地址 分割线下为copy的内容 [洛谷日报第62期]Splay简易教程 洛谷科技 18-10-0223:31 简介 二叉排序树(Binary Sor ...
- [洛谷日报第39期]比STL还STL?——pbds
[洛谷日报第39期]比STL还STL?——pbds 洛谷科技 发布时间:18-08-3116:37 __gnu_pbds食用教程 引入 某P党:“你们C++的STL库真强(e)大(xin),好多数 ...
- [洛谷日报#204] StackEdit——Markdown 编辑器的功能介绍
本文同时发表于洛谷日报,您也可以通过洛谷博客进行查看. 1.介绍与开始使用 1.1 这是什么? StackEdit是基于PageDown.Stack Overflow和其他堆栈交换站点使用的Markd ...
- 题解-洛谷P5410 【模板】扩展 KMP(Z 函数)
题面 洛谷P5410 [模板]扩展 KMP(Z 函数) 给定两个字符串 \(a,b\),要求出两个数组:\(b\) 的 \(z\) 函数数组 \(z\).\(b\) 与 \(a\) 的每一个后缀的 L ...
随机推荐
- MySQL(版本8.0.19)服务的启动/停止、登录/登出、修改密码
[先说明一点 ,windows系统下,英文字母不分大小写.] MySQL 服务的 启动 / 停止 方式一: (我的系统是windows10) 找到 此电脑 图标 右键点击,选择"管理&q ...
- 死磕HashMap
前言 HashMap是Java中最常用的集合类框架,也是Java语言中非常典型的数据结构,同时也是我们需要掌握的数据结构,更重要的是进大厂面试必问之一. 数组特点 存储区间是连续,且占用内存严重,空间 ...
- Hadoop学习之第一个MapReduce程序
期望 通过这个mapreduce程序了解mapreduce程序执行的流程,着重从程序解执行的打印信息中提炼出有用信息. 执行前 程序代码 程序代码基本上是<hadoop权威指南>上原封不动 ...
- C 语言学习 -1
头文件 stdio.h stdlib.h sting.h 先学习上面三个头文件: 1: stdio.h 这个头文件包含了 程序与外界数据交互的各种函数 说白了就是 用来处理 输入/输 ...
- Kaggle-pandas(4)
Grouping-and-sorting 教程 映射使我们可以一次将整个列中的数据转换为DataFrame或Series中的一个值. 但是,通常我们希望对数据进行分组,然后对数据所在的组进行特定的操作 ...
- JavaScript calss语法糖
JavaScript calss语法糖 基础知识 严格意义上来讲,在Js中是没有类这一概念的. 我们可以运用前面章节提到的构造函数来模拟出类这一概念,并且可以通过原型对象的继承来完美的实现实例对象方法 ...
- Azure Application Gateway(一)对后端 Web App 进行负载均衡
一,引言 今天,我们学习一个新的知识点-----Azure Application Gateway,通过Azure 应用程序网关为我么后端的服务提供负载均衡的功能.我们再文章头中大概先了解一下什么是应 ...
- dom4j解析xml时报出文件提前结束
在写javaweb小项目的时候,用dom4j解析xml报出如下错误: org.dom4j.DocumentException:Error ....... Nested exception: ...
- C#设计模式之16-迭代器模式
迭代器模式(Iterator Pattern) 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/417 访问. 迭代器模式 ...
- Flutter 容器(4) - Container
Container 类似于HTML中的div标签 import 'package:flutter/material.dart'; class AuthList extends StatelessWid ...