文章转自 洛谷


谈到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自带位运算系列函数的更多相关文章

  1. NOI2014 洛谷P2114 起床困难综合征(位运算)

    呃...这道题算是noi中比较简单的题吧...... 众所周知,位运算是个好东西,它就是对应的位进行运算,跟其他的位没有关系. 我们要选取一个m值使最后的攻击力最大,对于这个m,从高位开始枚举,判断该 ...

  2. 【洛谷P2114】起床困难综合征 位运算+贪心

    题目大意:给定 N 个操作,每个操作为按位与.或.异或一个固定的数字,现在要求从 0 到 M 中任选一个数字,使得依次经过 N 个操作后的值最大. 题解:位运算有一个重要的性质是:位运算时,无进位产生 ...

  3. 洛谷 P2114 [NOI2014]起床困难综合症 位运算

    题目描述 21世纪,许多人得了一种奇怪的病:起床困难综合症,其临床表现为:起床难,起床后精神不佳.作为一名青春阳光好少年,atm一直坚持与起床困难综合症作斗争.通过研究相关文献,他找到了该病的发病原因 ...

  4. 洛谷P2114 起床困难综合症【位运算】【贪心】

    题目:https://www.luogu.org/problemnew/show/P2114 题意:有n个操作,每个可以是与.或.异或 一个数. 初始值是0~m之间的一个数,问经过n个运算之后,可以得 ...

  5. 洛谷 1219:八皇后 (位运算 & DFS)

    题目链接: https://www.luogu.org/problem/show?pid=1219#sub row:受上面的皇后通过列控制的位置 ld:受上面的皇后通过从右至左的斜对角线控制的位置 r ...

  6. [洛谷日报第62期]Splay简易教程 (转载)

    本文发布于洛谷日报,特约作者:tiger0132 原地址 分割线下为copy的内容 [洛谷日报第62期]Splay简易教程 洛谷科技 18-10-0223:31 简介 二叉排序树(Binary Sor ...

  7. [洛谷日报第39期]比STL还STL?——pbds

    [洛谷日报第39期]比STL还STL?——pbds   洛谷科技 发布时间:18-08-3116:37 __gnu_pbds食用教程 引入 某P党:“你们C++的STL库真强(e)大(xin),好多数 ...

  8. [洛谷日报#204] StackEdit——Markdown 编辑器的功能介绍

    本文同时发表于洛谷日报,您也可以通过洛谷博客进行查看. 1.介绍与开始使用 1.1 这是什么? StackEdit是基于PageDown.Stack Overflow和其他堆栈交换站点使用的Markd ...

  9. 题解-洛谷P5410 【模板】扩展 KMP(Z 函数)

    题面 洛谷P5410 [模板]扩展 KMP(Z 函数) 给定两个字符串 \(a,b\),要求出两个数组:\(b\) 的 \(z\) 函数数组 \(z\).\(b\) 与 \(a\) 的每一个后缀的 L ...

随机推荐

  1. Android JNI之动态注册

    所谓动态注册,就是不用像静态注册那样按规则严格的命名native方法,而是在加载so库的时候完成这个从Java方法到native方法的匹配工作,而这个匹配工作,需要我们写native代码来完成.下面直 ...

  2. 国浩:Cassandra在360的最新进展

    大家好,我是来自奇虎360的国浩.今天我给大家带来的是Cassandra在360的最新进展. 我会从四个方面来介绍Cassandra在360的应用情况:Cassandra在360的使用历史再结合两个案 ...

  3. 深度学习论文翻译解析(十二):Fast R-CNN

    论文标题:Fast R-CNN 论文作者:Ross Girshick 论文地址:https://www.cv-foundation.org/openaccess/content_iccv_2015/p ...

  4. Chrome自动格式化Json输出

    对JSON格式的内容进行浏览和编辑,以树形图样式展现JSON文档,并可实时编辑 安装 Chrome商店 https://chrome.google.com/webstore/detail/json-h ...

  5. Android 给服务器发送网络请求

    今天听得有点蒙,因为服务器的问题,这边建立服务器的话,学长用的是Idea建立的Spring之类的方法去搞服务器. 然后就是用Android去给这个服务器发送请求,大致效果还是懂的,就是像网站发送请求, ...

  6. 嵌入式linux系统应用开发

    关于嵌入式系统   平时大家说的嵌入式其实范围比较广的,是一种软硬件可裁剪,以应用为中心开发的专用系统,硬件平台可以是单片机,或者以ARM系列的处理器.单片机一般直接裸奔程序,不过现在有了好多基于单片 ...

  7. C语言学习笔记之进制之间的转换

    这一篇主要是对进制之间转换的讲解,方便查看,以防忘记 二进制      逢二进一 八进制      逢八进一                以0开头, 0就是8进制的标志 十进制      逢十进一 ...

  8. python爬虫之Beautiful Soup基础知识+实例

    python爬虫之Beautiful Soup基础知识 Beautiful Soup是一个可以从HTML或XML文件中提取数据的python库.它能通过你喜欢的转换器实现惯用的文档导航,查找,修改文档 ...

  9. 记录一次idae和maven设置的巨坑

    这个忽略pom.xml文件千万别勾选,不然会导致项目的pom.xml怎么填写都无法导入新的依赖包!

  10. 利用哈希map快速判断两个数组的交集

    在大多数情况,也就是一般的情况下,大家都能想出最暴力的解法,通常也就是采用遍历或者枚举的办法来解决问题. 该题需要找出两个数组的交集,最简单的一个办法就是用A数组里面的所有数去匹配B数组里面的数.假设 ...