__builtin_xxx指令学习【5】__builtin_bswap16/32/64

这篇具有很好参考价值的文章主要介绍了__builtin_xxx指令学习【5】__builtin_bswap16/32/64。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

__builtin_bswap16/32/64是GCC和Clang编译器提供的内置函数,用于交换一个整数的字节顺序。其中,__builtin_bswap16用于交换一个16位整数的字节顺序,__builtin_bswap32用于交换一个32位整数的字节顺序,__builtin_bswap64用于交换一个64位整数的字节顺序。这些函数的使用背景是在一些网络编程和底层编程中,需要对字节序进行处理和转换,而交换字节顺序是一个常见的操作。

__builtin_bswap16/32/64的内部原理是使用CPU的指令集来实现交换。具体来说,当CPU支持BSWAP指令时,__builtin_bswap16/32/64会使用BSWAP指令来实现交换;否则,__builtin_bswap16/32/64会使用一些位运算技巧来实现交换。在实现中,__builtin_bswap16/32/64会根据不同的CPU架构和编译器选项来选择最优的实现方式,从而提高交换效率。

__builtin_bswap16/32/64的弊端是可能会导致代码的可移植性问题。由于__builtin_bswap16/32/64是GCC和Clang编译器提供的内置函数,因此在使用__builtin_bswap16/32/64时,需要确保代码的可移植性,并且需要在代码中添加条件编译来处理不支持BSWAP指令的CPU。另外,由于__builtin_bswap16/32/64的实现依赖于CPU架构和编译器选项,因此在不同的平台和编译器下,__builtin_bswap16/32/64的性能可能会有差异。

下面给出一个demo,这里为了平台兼容性我们也实现了不支持__builtin_bswap的对应的函数。

在这个代码中,我们首先使用defined(__GNUC__) || defined(__clang__)来判断当前编译器是否是GCC或Clang。如果是,我们再使用defined(__x86_64__) || defined(__i386__)来判断当前CPU是否是x86或x86-64架构。如果是,我们就定义BSWAP_SUPPORTED宏,表示当前CPU支持BSWAP指令。

接下来,我们使用#ifdef BSWAP_SUPPORTED来判断当前CPU是否支持BSWAP指令。

#include <iostream>
#include <chrono>
#include <cstdint>

#if defined(__GNUC__) || defined(__clang__)
    #if defined(__x86_64__) || defined(__i386__)
        #define BSWAP_SUPPORTED
    #endif
#endif

#ifdef BSWAP_SUPPORTED
    #define bswap16 __builtin_bswap16
    #define bswap32 __builtin_bswap32
    #define bswap64 __builtin_bswap64
#else
    template<typename T>
    T bswap(T value) {
        static_assert(std::is_integral<T>::value, "bswap only works with integral types");
        uint8_t* ptr = reinterpret_cast<uint8_t*>(&value);
        for (size_t i = 0, j = sizeof(T) - 1; i < j; ++i, --j) {
            std::swap(ptr[i], ptr[j]);
        }
        return value;
    }

    template<typename T>
    T bswap16(T value) {
        static_assert(std::is_integral<T>::value, "bswap16 only works with integral types");
        uint16_t result = bswap(static_cast<uint16_t>(value));
        return static_cast<T>(result);
    }

    template<typename T>
    T bswap32(T value) {
        static_assert(std::is_integral<T>::value, "bswap32 only works with integral types");
        uint32_t result = bswap(static_cast<uint32_t>(value));
        return static_cast<T>(result);
    }

    template<typename T>
    T bswap64(T value) {
        static_assert(std::is_integral<T>::value, "bswap64 only works with integral types");
        uint64_t result = bswap(static_cast<uint64_t>(value));
        return static_cast<T>(result);
    }
#endif

int main() {
    uint16_t a = 0x1234;
    uint32_t b = 0x12345678;
    uint64_t c = 0x123456789abcdef0;

    std::cout << std::hex << bswap16(a) << "\n";
    std::cout << std::hex << bswap32(b) << "\n";
    std::cout << std::hex << bswap64(c) << "\n";

    return 0;
}

打印文章来源地址https://www.toymoban.com/news/detail-411360.html

3412
78563412
f0debc9a78563412

到了这里,关于__builtin_xxx指令学习【5】__builtin_bswap16/32/64的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • EDA16--STA静态时序分析--PT指令(二)

    PT启动时需要初始化,参照上节内容完成。 PT不能读取 RTL 源文件,它是静态分析引擎,只能读取映射后的设计,包括db、verilog、vhdl 等格式的文件。读入设计的命令格式如下: 由于db格式的网表中包含了约束和环境属性等,故使用-netlist_only选项指示PT只加载结构化网表。 时序

    2024年02月02日
    浏览(38)
  • KT142C-sop16语音芯片ic的串口指令详细说明_默认9600指令可设

    支持异步串口通讯模式,通过串口接受上位机发送的命令 通讯标准:9600 bps --- 可以发送指令修改,并且记忆,详见 3.4.5 数据位  :8    停止位  :1    校验位  :none    流控制  :none 格式:$S  VER  Len  CMD  Feedback  para1  para2  checksum  $O 1 0x7E 起始标记 2 CMD 命令字节 3 lenH

    2024年02月09日
    浏览(50)
  • Linux命令-builtin命令(执行bash内建命令)

    用于执行指定的bash内建命令。 builtin 命令调用的bash内建命令优先于同名的外部命令及同名的shell函数。 shell-builtin(可选):要调用的bash内建命令。 arg(可选):传递给bash内建命令的一到多个参数。 返回该内建命令执行的返回值,除非传递的不是bash内建命令或该内建命令

    2024年02月19日
    浏览(108)
  • 【git push指令提交项目报错】 fatal: unable to access ‘https://github.com/xxxxx/xxx.git/‘: OpenSSL SSL_read: Co

    问题一: 问题二: 两个问题都可以以下尝试 1. 关闭网络代理(比如关闭网络代理等vpn), 2.所连网络是校园网等内网,没有权限访问github网站(可以直接点击github官网测试一下),如果确实无法访问,直接连手机热点就可以。 另附git提交指令:

    2024年02月16日
    浏览(81)
  • R语言【cli】——builtin_theme():内置的CLI主题

    Package  cli  version 3.6.0 此主题始终处于活动状态,并且位于主题堆栈的底部。 参数【dark】 :是否使用黑暗主题。cli.theme_dark选项可用于显式请求暗主题。如果没有设置,或者设置为“auto”,那么cli会尝试检测暗主题,这在最近的RStudio版本和macOS上的term中都有效。 一个命名

    2024年01月25日
    浏览(68)
  • 【ARM 嵌入式 编译系列 5 -- GCC 内建函数 __builtin 介绍】

    请阅读 【ARM GCC 编译专栏导读】 上篇文章:ARM 嵌入式 编译系列 4.2 – GCC 链接规范 extern “C“ 介绍 下篇文章:ARM 嵌入式 编译系列 6 – GCC objcopy, objdump, readelf, nm 介绍 GCC提供了一些专门的功能,用于访问特定的硬件指令或者实现特定的优化,它们被称为\\\" __builtin \\\"函数。 这些

    2024年02月13日
    浏览(68)
  • 【ARM 嵌入式 编译系列 5 -- GCC 内建函数 __builtin 详细介绍】

    请阅读 【ARM GCC 编译专栏导读】 上篇文章:ARM 嵌入式 编译系列 4.2 – GCC 链接规范 extern “C“ 介绍 下篇文章:ARM 嵌入式 编译系列 6 – GCC objcopy, objdump, readelf, nm 介绍 GCC提供了一些专门的功能,用于访问特定的硬件指令或者实现特定的优化,它们被称为\\\" __builtin \\\"函数。 这些

    2024年02月13日
    浏览(65)
  • 【ARM64 常见汇编指令学习 13 -- ARM 汇编 ORG 伪指令学习】

    上篇文章:ARM64 常见汇编指令学习 12 – ARM 汇编函数 的学习 下篇文章:ARM64 常见汇编指令学习 14 – ARM 汇编 .balign,.balignw,.balign 伪指令学习 在ARM汇编中,\\\" org \\\"是一个汇编器伪指令,用于设置下一条指令的装入地址。\\\" org \\\"后面跟着的是一个表达式,这个表达式的值就是下一条

    2024年02月14日
    浏览(50)
  • 【ARM 常见汇编指令学习 7 - LDR 指令与LDR伪指令及 mov指令】

    上篇文章:ARM 常见汇编指令学习 6 - bic(位清除), orr(位或), eor(异或) 下篇文章:ARM 常见汇编指令学习 8 - dsb sy 指令及 dsb 参数介绍 LDR指令 与 LDR伪指令 两者虽然名字相同但是作用却不相同,区分两者的方法就是看第二个参数,如果有等号,就是LDR伪指令。 LDR 指令 上面语句的

    2024年02月14日
    浏览(70)
  • pytorch+GPU跑模型时 nvrtc: error: failed to open nvrtc-builtins64_117.dll

    1. 先检查自己cuda版本: 如果版本高于11建议先降版本,然后再试下。 2. 重新安装nvrtc-builtins64_117.dll 下载缺失文件 拷贝到指定目录C: Windows System32 点击运行即可 3. 文件已上传到资源,文章顶部可见

    2024年02月14日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包