__builtin_clz,__builtin_ctz 以及 __builtin_clzll,__builtin_ctzll 在 x=0 时均无定义。
另外需要注意,编译器会优化掉字面量,例如
cin>>x;
cout<<__builtin_clz(0)<<endl;
cout<<__builtin_clz(x)<<endl;
当输入为 0 时两行的输出不同(无论是否 O2)。
无定义函数的返回值视计算机硬件,编译器版本,操作系统甚至是计算机此时的物理温度会有不同,所以用的时候最好特判一下,有可能本地计算机心情比较好能让你过拍。
可以用以下代码测试:
#include<bits/stdc++.h>
signed main()
{
int x;
std::cin>>x;
std::cout<<__builtin_clzll(0)<<'\n';
std::cout<<__builtin_ctzll(0)<<'\n';
std::cout<<__builtin_clz(0)<<'\n';
std::cout<<__builtin_ctz(0)<<'\n';
std::cout<<__builtin_clzll(x)<<'\n';
std::cout<<__builtin_ctzll(x)<<'\n';
std::cout<<__builtin_clz(x)<<'\n';
std::cout<<__builtin_ctz(x)<<'\n';
}
如果你不相信它和计算机此时的物理温度有关,你可以多试几遍,每次尝试的时候可以多打开一个占内存较大的应用比如说 Visual Studio。
模拟挂大分的警告。
__builtin_popcount 在 x=0 时有定义。