[奇怪の东西]__builtin函数

  记录一些 __builtin 开头的函数。

  • __builtin_ffs(x) 返回 \(x\) 最后一个 \(1\) 是向前几位,而 __builtin_ffs(x) - 1 就是 \(x\) 最后一个为 \(1\) 的位置是 \(2\) 的几次方;

  • __builtin_clz(x) 返回 \(x\) 二进制下前导 \(0\) 的个数;

  其代码实现:

int __builtin_clzl(unsigned long x) {
    int r = 0;
    if (!(x & 0xFFFFFFFF00000000)) r += 32, x <<= 32;
    if (!(x & 0xFFFF000000000000)) r += 16, x <<= 16;
    if (!(x & 0xFF00000000000000)) r += 8,  x <<= 8;
    if (!(x & 0xF000000000000000)) r += 4,  x <<= 4;
    if (!(x & 0xC000000000000000)) r += 2,  x <<= 2;
    if (!(x & 0x8000000000000000)) r += 1,  x <<= 1;
    return r;
}
  • __builtin_ctz(x) 返回 \(x\) 二进制下末尾 \(0\) 的个数;

  代码实现:

 int __builtin_ctzl(unsigned long x) {
    int r = 63;
    x &= ~x + 1;
    if (x & 0x00000000FFFFFFFF) r -= 32;
    if (x & 0x0000FFFF0000FFFF) r -= 16;
    if (x & 0x00FF00FF00FF00FF) r -= 8;
    if (x & 0x0F0F0F0F0F0F0F0F) r -= 4;
    if (x & 0x3333333333333333) r -= 2;
    if (x & 0x5555555555555555) r -= 1;
    return r;
}
  • __builtin_parity(x) 返回 \(x\)\(1\) 数量的奇偶性;
  • __builtin_popcount(x) 返回 \(x\)\(1\) 的数量;

代码实现:

int __builtin_popcountl(unsigned long x) {
    x = (x & 0x5555555555555555) + (x >> 1  & 0x5555555555555555);
    x = (x & 0x3333333333333333) + (x >> 2  & 0x3333333333333333);
    x = (x & 0x0F0F0F0F0F0F0F0F) + (x >> 4  & 0x0F0F0F0F0F0F0F0F);
    x = (x & 0x00FF00FF00FF00FF) + (x >> 8  & 0x00FF00FF00FF00FF);
    x = (x & 0x0000FFFF0000FFFF) + (x >> 16 & 0x0000FFFF0000FFFF);
    x = (x & 0x00000000FFFFFFFF) + (x >> 32 & 0x00000000FFFFFFFF);
    return x;
}

  上述函数都有对应的 long long 形式,在后面加 ll 就行了.

推荐这些文章:

快速幂&矩阵快速幂

求xn
朴素方法
遍历从1到n的所有数然后累乘即可
int simplePower(int x, int n){
int answer = 1;
for(int i = 1; i <= n; ++i){
answer *= i;
}
return answer;
}

时间复杂度为O(n)
快速幂
原理
xn
其中n = 2i + 2j + ... + 2k
一边求n的二进制一边根据每二进制位判断是否进行累乘,则时间复杂度为O(logn)
代码
int QuickPower(int x, int n){
int answer = ...

使用类做为Dictionary<T,K>的key需什么要求?

问题
<P>&nbsp;</P>

最佳回答
没有要求

...

pagehelper查询返回的是全部记录,springboot与插件存在版本问题

1 <dependency>
2 <groupId>org.mybatis</groupId>
3 <artifactId>mybatis</artifactId>
4 <version>3.5.5</version>
5 </dependency>
6
7 <dependency>
8 <groupId>org.mybatis...

1.网页代码基本构造

 

1 <!DOCTYPE html>
2 <html lang="en">
3 <head><!-- 头部 -->
4 <meta charset="utf-8" />
5 <title></title>
6 </head>
7 <body><!-- 身体 -->
8 </body>
9 </html>

 

...

位运算统计二进制整数中1的个数

k=k&(k-1)可以消除k的二进制数的最后一个1.连续进行这个操作,每次消除一个1,直到全部消除为止。操作次数就是1的个数。
int num=0;
cin>>k;
while(k>0)
{
    k=k&(k-1);
    num++;
}
cout<<num<<endl;

...

Java:Bytes转short、int、long

Java:Bytes转short、int、long
bytes转short、int、long

/**
* @description bytes转short
*/
public static short bytesToShort(byte[] b) {
short s = 0;
short s0 = (short) (b[0] & 0xff);// 最低位
short s1 = (short) (b[1] & 0xff);
s0 <<= 8;
s = (short) (s0 | s1);
...

C-(练习)求两个数二进制中不同位的个数

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
//求两个数二进制中不同位的个数

int main()
{
int n = 0;
scanf("%d", &n);
//获取n的2进制中的奇数位和偶数位
//
int i = 0;
//打印偶数位
for (i = 31; i >= 1; i -= 2)
{
printf("%d ", (n >> i) & 1);
}
printf("\n");...

C++ numeric types max values via numeric_limits<T>::max()

#include <iostream>
#include <limits.h>
void Util::showMax(){ cout<<fixed<<"INT32_MAX="<<INT32_MAX<<endl; cout<<fixed<<"UINT32_MAX="<<UINT32_MAX<<endl; cout<<fixed<<"INT64_MAX="<<INT64_MAX<<endl; cout&l...

Maven <build>

1. <build>

1.1 <resources>

编译保留 *.propertie s,*.xml

1.2 <plugins>

拷贝config目录
Java 1.8 编译
一般打包(无Spring)
Spring 打包

2. <properties>

编码 编译版本

1. <build>
1.1 <resources>
编译保留 *.propertie s,*.xml
<resource>
<directory>src/main/java</dire...

c++中数字的二进制,八进制,十进制和十六进制的输出

头文件iostream中提供控制符:

dec: 指示cout以10进制输出。
hex: 指示cout以16进制输出。
oct: 指示cout以8进制输出。

但是二进制并没有类似的控制符。需要使用bitset把要输出的数本身,转变成二进制形式输出。
#include <iostream>
#include <Windows.h>
#include <bitset>
using namespace std;

int main()
{
int value = 0;

cout << "请输入一个整数: ";
...

文章标题:[奇怪の东西]__builtin函数
文章链接:https://www.dianjilingqu.com/50817.html
本文章来源于网络,版权归原作者所有,如果本站文章侵犯了您的权益,请联系我们删除,联系邮箱:saisai#email.cn,感谢支持理解。
THE END
< <上一篇
下一篇>>