二进制中 1 的个数 ——《C/C++ 位运算黑科技 03》
原理计算一个二进制数中 1 的出现次数其实很简单,只需要不断用 v & (v - 1) 移除掉最后一个 1 即可,原理可以参考这篇文章:2 的幂次方 ——《C/C++ 位运算黑科技 02》 上述方法是一个普通的思考方向,下面我会介绍另外一种思路:并行计数器,来计算二进制数中出现的 1 实际上,我们可以将这个数看作是全部由单位的计数器组成,1、0 就代表单个计数器的状态,我们只要合并相邻的计数器即可,这其实也是归并的思想。 代码12345678910111213141516171819202122232425262728293031323334353637inline unsigned count_bits(uint64_t v){ v = (v & 0x5555555555555555) + ((v >> 1) & 0x5555555555555555); v = (v & 0x3333333333333333) + ((v >> 2) & 0x3333333333333333); ...
2 的幂次方 ——《C/C++ 位运算黑科技 02》
原理现在我们使用的二进制码表示都很简单:1、2、4、8、16 ······ 仔细观察就可以发现:在一串二进制数中,如果只出现一个 1,它就是 2 的幂次方 代码12345template <typename T, class = std::enable_if_t<std::is_integral_v<T>>>inline bool power2_1(T v){ return v && !(v & (v - 1));} 或者 12345template <typename T, class = std::enable_if_t<std::is_integral_v<T>>>inline bool power2_2(T v){ return v && (v & -v) == v;} 原理剖析方法一因为 2 的幂次方只有一个 1,我们只需要去掉最后一个 1 后判断是否等于 0 即可。 1v & (v - 1 ...
绝对值 ——《C/C++ 位运算黑科技 01》
原理求一个数的绝对值就是将负数转为正数,只需要求其补码即可(反码加一) 代码12345template <typename T, class = typename std::enable_if_t<!std::is_unsigned_v<T>>>inline typename std::make_unsigned_t<T> mabs(T _val) { const T mask = _val >> (sizeof(T) * 8 - 1); return (_val ^ mask) - mask;} 原理剖析以 -12 为例:-12 的补码为 10100(这里假设机器字长为 5 位) 步骤如下: 先获取掩码 mask: 1const T mask = _val >> (sizeof(T) * 8 - 1); 10100 左移 4 位得到 11111,注意这里的 11111,是一个非常精巧的设计。 为什么我们是选择右移获取掩码,而不是直接右移四位然后 & 上 0x1 ...
可信软件设计实验环境搭建
非常坑,之前尝试过使用 yum 直接安装 trousers,会出现 TPM_E_NOAUTH 的问题,现在使用 trousers-0.3.15 进行编译后能够正常进行实验,目前还不清楚是什么包的问题导致的,因此要确保系统是全新的。 基础环境准备实验环境基于 CentOS7,确保你的系统是全新的,否则会有不清楚的包依赖或冲突问题 更新内核 1yum update -y 安装基础开发组相关包 1yum groupinstall "Development Tools" 安装依赖的软件包 1yum install -y automake autoconf pkgconfig libtool gtk2-devel openssl-devel glibc-devel gmp-devel cmake psmisc 先上传 tc.tgz ,然后解压,进入 tc 目录中 12345678[root@localhost ~]# lsanaconda-ks.cfg tc.tgz[root@localhost ~]# tar -xzf tc.tgz [root@localho ...
CMake 项目 CMakelist.txt 模板
CMake 项目中 CMakelist.txt 应该怎么写,才能够实现跨平台编译? 这是我写的一个 CMake 项目的模板仓库:https://github.com/hominsu/cmake-project-layout/tree/main 包括了: Linux 下项目的编译 Windows 下项目的编译 MacOS 下项目的编译 Windows 下 vcpkg 的使用,分别适配 Mingw 和 MSVC 设定 MSVC 的 Runtime Library (主要解决导入的库使用的是 libcmt 导致与 MSVC 默认值冲突的问题,例如 openssl) … 请不要将这个仓库作为一个真正的模版来使用,我希望的是你能从中学习到 CMake 的一些语法和技巧,以及一些工程、架构设计思想,然后自己尝试来写。 👷 持续更新中等不及了可以去仓库提 issue 催我 😤
Vcpkg 的安装与使用
需求先确保你已经安装了: Windows7 及以上的版本 Git Visual Studio 2015 Update 3 及以上的版本 关于美化 Windows Terminal 及 Powershell,可以查看这篇优秀文章: Windows-Terminal 美化以及通过 OhMyPosh 美化 PowerShell 为 Visual Studio 安装英文语言包vcpkg 需要 Visual Studio 安装了英文语言包,安装步骤如下: 打开 Visual Studio Installer,然后点击修改 然后点击语言包,勾选英语并确认修改,等待安装完成即可 安装 Vcpkg先克隆 vcpkg,目录任意位置都可,我克隆到 D:\Library 下,这样做包管理会很方便 然后进入到 vcpkg 目录,执行安装脚本 bootstrap-vcpkg.bat cd vcpkg .\bootstrap-vcpkg.bat 或者直接执行:.\vcpkg\bootstrap-vcpkg.bat 安装包在 vcpkg 目录下,执行 .\vcpkg.exe sea ...
Golang engineering
工程项目结构API 设计配置管理包管理测试References
C++ 调用 ffmpeg 进行 rtmp 推流
效果 🔅Clion 中演示的效果 终端中运行也没有问题 思路 💡 通过 fork 一个子进程来调用 ffmpeg 进行推流,视频帧通过 opencv 来获取,通过管道传输到子进程,实现推流 代码 🔨 需要注意的是,机器上要先安装 ffmpeg,其次视频的帧率一定要匹配,否则会出现莫名其妙的问题 main.cc:1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071#include <iostream>#include <csignal>#include <opencv4/opencv2/opencv.hpp>bool is_running = true;void OnSignal(int) { is_running = false;}int main() { // 触发下面的信号就退出 sig ...
C++ 11 新特性
C++ 11 的一些新特性 原始字面量R("string...") 示例: 123456789101112131415#include <iostream>int main() { std::string str = R"(../../text.cc 上面换了个行)"; std::cout << str << std::endl;}[Running] cd "/root/code-server/c11-new/" && g++ 字符串字面量.cc -o 字符串字面量 && "/root/code-server/c11-new/"字符串字面量../../text.cc 上面换了个行[Done] exited with code=0 in 0.269 seconds nullptr这个没什么好说的,替换 NULL 使用即可,这玩意不等于 0 auto & declty ...
二进制基础
做 pwn 或者 reverse 的一些基础 程序的编译与链接 编译:由C语言代码生成汇编代码 汇编:由汇编代码生成机器码 链接:将多个机器码的目标文件链接成一个可执行文件 Linux下的可执行文件格式ELF 可执行文件:.out 动态链接库:.so 静态链接库:.a Windows下的可执行文件格式PE 可执行文件:.exe 动态链接库:.dll 静态链接库:.lib ELF文件结构 节视图(磁盘中划分程序)、段视图(内存中) 32位系统虚拟内存大小为4GB(2的32次方) 并且内核空间(kernal)共享,下面的用户空间为3GB,上面的内核空间为1GB 操作系统(arch为例):1. linux内核(不同发行版都一样)。 2. 软件是由GUN开发的(ls, cd等) 3. arch提供软件源 4. 桌面环境也是一个用户态程序(也是一个软件) 内核是用于管理硬件的, 所以内核只要在内存中装载一份,复用的思想 glic动态链接库在内存中也只有一份 64位操作系统256TB, 内核128TB, 用户128TB 内存从低位向高位 ...