【洛谷日报#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 ...
随机推荐
- 6.18 省选模拟赛 树 倍增 LCT
LINK:树 考虑暴力 保存每个版本的父亲 然后暴力向上跳.得分20. 考虑离线 可以离线那么就可以先把树给搞出来 然后考虑求k级祖先 可以倍增求. 如何判断合法 其实要求路径上的边的时间戳<= ...
- IntelliJ IDEA 控制台输出中文乱码
IntelliJ IDEA 控制台输出中文乱码部分如图所示: 解决方法一: 1.打开IntelliJ IDEA本地安装目录中bin文件夹下的idea.exe.vmoptions和idea64.exe. ...
- 算法图解(python2.7)高清PDF电子书
点击获取提取码:pzhb 内容简介 本书示例丰富,图文并茂,以让人容易理解的方式阐释了算法,旨在帮助程序员在日常项目中更好地发挥算法的能量.书中的前三章将帮助你打下基础,带你学习二分查找.大O表示法. ...
- OpenCL 增强单work-item kernel性能策略
1.基于反馈的Optimization Report解决单个Work-item的Kernel相关性 在许多情况下,将OpenCL™应用程序设计为单个工作项内核就足以在不执行其他优化步骤的情况下最大化性 ...
- 29-main()的使用说明
* 1. main()方法作为程序的入口 * 2. main()方法也是一个普通的静态方法 * 3. main()方法可以作为我们与控制台交互的方式.(使用Scanner) 如何将控制台获取的数据传给 ...
- spring boot 中使用spring security阶段小结
1 项目结构图 2 AnyUserDetailsService package com.fengyntec.config; import com.fengyntec.entity.UserEntity ...
- canvas小画板——(2)荧光笔效果
我们在上一篇文章中讲了如何绘制平滑曲线 canvas小画板——(1)平滑曲线. 透明度实现荧光笔 现在我们需要加另外一种画笔效果,带透明度的荧光笔.那可能会觉得绘制画笔的时候加上透明度就可以了.我们来 ...
- C# ASP response.write()弹出提示框后页面布局被打乱
发现在使用了response.write后样式发生了变化,位置和字体都不正确.Response.Write("<script>alert(')</script>&qu ...
- 2020-04-06:为什么HashMap不一直使用红黑树?
红黑树的阈值是8,当链表大于等于8时链表变成了红黑树结构,大大减少了查找的时间. 当长度低于6时会由红黑树转成链表,TreeNodes占用空间是普通Nodes的两倍,所以只有当bin包含足够多的节点时 ...
- C#LeetCode刷题之#344-反转字符串(Reverse String)
问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3933 访问. 编写一个函数,其作用是将输入的字符串反转过来. 输 ...