如果这篇博客帮助到你,可以请我喝一杯咖啡~
CC BY 4.0 (除特别声明或转载文章外)
GCC 内置位运算
int __builtin_clz(unsigned int x); //求前缀0的个数
int __builtin_ctz(unsigned int x); //求后缀0的个数
int __builtin_ffs(unsigned int x); //x的二进制末尾最后一个1的位置,从1开始
int __builtin_popcount(unsigned int x); //x二进制中1的个数,相当于bitset::count()
int __builtin_parity(unsigned int x); //判断x的二进制中1的个数的奇(1)偶(0)性,这些函数都有相应的usigned long和usigned long long版本,只需要在函数名后面加上l或ll就可以了,比如__builtin_clzll
开栈
For C++
#pragma comment(linker, "/STACK:102400000,102400000") //For C++
For G++
int main() //For G++
{
int size = 256 << 20; //256MB
char *p = (char *)malloc(size) + size;
__asm__ __volatile__("movq %0, %%rsp\n" ::"r"(p)); //64bit,一定要最后写一句`exit(0);`退出程序,否则会得到非零退出的错误,可能RE。
}
读入优化
C 文件指针版
ll getll(FILE *in = stdin)
{
ll val = 0, sgn = 1, ch = getc(in);
for (; !isdigit(ch) && ch != EOF; ch = getc(in))
if (ch == '-')
sgn = -sgn;
for (; isdigit(ch); ch = getc(in))
val = val * 10 + ch - '0';
return ungetc(ch, in), sgn * val;
}
lf getlf(FILE *in = stdin)
{
lf val = getll(in), p = val < 0 ? -1 : 1;
ll ch = getc(in);
if (ch == '.')
for (ch = getc(in); isdigit(ch); ch = getc(in))
val += (p /= 10) * (ch - '0');
return ungetc(ch, in), val;
}
仿 C++IO 流沙雕版
#define cin kin
struct Istream
{
char b[20 << 20], *i, *e; //20MB
Istream(FILE *in) : i(b), e(b + fread(b, sizeof(*b), sizeof(b), in)) {}
bool eof() const
{
return i == e;
}
Istream &operator>>(long long &val)
{
return val = strtoll(i, &i, 10 /*进制,取值2~36*/), *this;
}
Istream &operator>>(ll &val) //极限快
{
while (*i < '0')
++i; //无符号
for (val = 0; *i >= '0'; ++i)
val = (val << 3) + (val << 1) + *i - '0';
return *this;
}
Istream &operator>>(double &val)
{
return val = strtod(i, &i), *this;
}
Istream &operator>>(string &s)
{
while (!eof() && isspace(*i))
++i;
for (s.clear(); !eof() && !isspace(*i); ++i)
s += *i;
return *this;
}
} kin(stdin);