C++位運(yùn)算常見操作
一些位運(yùn)算的常見操作整理如下注意位運(yùn)算操作符的優(yōu)先級(jí)都非常低盡量記得加括號(hào)。給第n位(從右邊開始數(shù)初始位置0)值置1int set_bit(int x, int n){ return x | (1 n); }清除第n位(從右邊開始數(shù)初始位置0)int clear_bit(int x, int n){ return x ~ (1 n); }得到第n位(從右邊開始數(shù)初始位置0)bool get_bit(int x, int n){ return x (1 n); }注意int數(shù)字的第n位和string數(shù)字的第n位不一樣int數(shù)字 (例如 011100110110001) 的第n位是從右往左數(shù)string數(shù)字 (例如011100110110001)的第n位通常是從左往右數(shù)。a ^ b (異或)是不進(jìn)位加法即 a ^ b 相加之后該進(jìn)位的地方不進(jìn)位的結(jié)果。 a b 就是a 和 b 里都是1的那些位置。一個(gè)例子如下:不用完成加法的算法int aplusb(int a, int b) { while (b) { int a1 a ^ b; int b1 (a b) 1; a a1; b b1; } return a; }以a3 (0011) b5(0101)為例。a 0011 0110 0100 0000 1000 (return) //未進(jìn)位加法和b 0101 0010 0100 1000 0000 //進(jìn)位遞歸版本如下int aplusb(int a, int b) { if (a 0) return b; if (b 0) return a; return aplusb((a b) 1, a ^ b); }消去二進(jìn)制中最右側(cè)的那個(gè)1:x (x - 1)一些例子如下檢查n是否為2的冪次位bool checkPowerOf2(int n) { return n 0 (n (n - 1)) 0; }計(jì)算一個(gè)32位整數(shù)有多少個(gè)1int countOnes(int num) { int count 0; while (num) { count; num num - 1; } return count; }計(jì)算a要反轉(zhuǎn)多少位變成bint bitSwapRequired(int a, int b) { int c a ^ b; int count 0; while (c) { count; c c - 1; } return count; }x (-x) 是x的最右邊一個(gè)1的位置對(duì)應(yīng)的數(shù) (注意x(x-1)是將其該位消去)。如12 (-12) 返回4。8 (-8) 返回8。這個(gè)技巧是線段樹(Binary Index Tree)算法里面的核心技巧(見Lowbit(x))。取反操作~正整數(shù)的按位取反是其本身1的負(fù)數(shù)A (1)10 (00000000000000000000000000000001)2~A ~ (1)10 (11111111111111111111111111111110)2 (-2)10負(fù)整數(shù)的按位取反是其本身1的絕對(duì)值零的按位取反是 -1基于union的bitmap的操作。typedef union { int all; struct { int flag0 : 1; //bit 0 int flag1 : 1; //bit 1 int flag2 : 1; //bit 2 ... int flag15 : 1; //bit 15 int rsvd : 16; //bit 16-31 } bits; }cntl_t; #define BIT(x) 1((n)) cntl_t cntl;對(duì)flag2的操作如下#define clear_flag2() (cntl.bits.all ~BIT(2)) #define set_flag2() (cntl.bits.all | BIT(2)) #define get_flag2() (cntl.bits.flag2)也可以直接對(duì)flag進(jìn)行讀寫操作。比如說cntl.bibts.flag2 3;下面這個(gè)鏈接對(duì)C/C bit field的操作說的非常清楚是一個(gè)非常好的鏈接。https://aticleworld.com/bit-field-in-c/Gray Code 的生成一種方法是基于i ^ (i 1)。負(fù)數(shù)的移位很重要C/C中左移是邏輯移位右端補(bǔ)0所以負(fù)數(shù)左移有可能變成正數(shù)C/C中右移是算數(shù)移位左端補(bǔ)齊最高位的符號(hào)位。負(fù)數(shù)右移肯定還是負(fù)數(shù)。引用https://blog.csdn.net/e3399/article/details/7526230的例子/********************************************************************** * Compiler: GCC ************************************************************************/ #include stdio.h int main(int argc, char **argv) { int i 0x8000000f; //這里的0x8000000f為int型數(shù)據(jù)的補(bǔ)碼形式 int j i 3; //右移是算術(shù)移位左端補(bǔ)齊的是符號(hào)位 int k i 1; //左移是邏輯移位右端補(bǔ)0 printf(%d %x\n, i, i); printf(%d %x\n, j, j); printf(%d %x\n, k, k); i -9; printf(%d %x\n, i, i); i 0xfffffff7; j i 3; k i 1; printf(%d %x\n, i, i); printf(%d %x\n, j, j); printf(%d %x\n, k, k); return 0; }Output:-2147483633 8000000f-268435455 f000000130 1e-9 fffffff7-9 fffffff7-2 fffffffe-18 ffffffee注意-9 1 -18, 并不是乘2這么簡(jiǎn)單。-9的補(bǔ)碼是0xffffffff71后變成0xffffffEE即1111…1110 1110此即-18的補(bǔ)碼。用16進(jìn)制的形式對(duì)數(shù)據(jù)進(jìn)行賦值這16進(jìn)制的數(shù)代表的是補(bǔ)碼補(bǔ)碼負(fù)數(shù)的補(bǔ)碼是在其原碼的基礎(chǔ)上,符號(hào)位不變, 其余各位取反, 最后1. (即在反碼的基礎(chǔ)上1)[1] [00000001]原 [00000001]反 [00000001]補(bǔ)[-1] [10000001]原 [11111110]反 [11111111]補(bǔ)i 0xfffffff7; //0xfffffff7是補(bǔ)碼而不是原碼故i -9 printf(%d %x\n, i, i); i -9; printf(%d %x\n, i, i); //故兩個(gè)printf輸出結(jié)果相同12取模運(yùn)算可以用a % b a - (a / b) * b如果b為2的n次方可用a % b a (b - 1)2147483648實(shí)際上是存的-2147483648?因?yàn)?147483647 01111111 11111111 11111111 11111111-2147483647表示為(2的補(bǔ)碼)10000000 00000000 00000000 00000001-2147483648(2的補(bǔ)碼)還可以比-2147483647少1所以是10000000 00000000 00000000 00000000另外實(shí)際上補(bǔ)碼的補(bǔ)碼就是原碼(數(shù)的原始表示)所以10000000 00000000 00000000 00000000 的補(bǔ)碼是11111111 11111111 11111111 11111111 1第一個(gè)1是負(fù)號(hào)所以1111111 11111111 11111111 11111111 1 10000000 00000000 00000000 000000002147483648這里第一個(gè)1是實(shí)際數(shù)字。加上負(fù)號(hào)即-2147483648。另外11111111,11111111,11111111,11111111看起來很大實(shí)際上是存的-1。位運(yùn)算如果和硬件結(jié)合起來會(huì)更快。比如說ARM芯片支持__clz()內(nèi)置函數(shù)返回某無符號(hào)整數(shù)的前置0的個(gè)數(shù)。Syntax: unsigned char __clz(unsigned int val) Return value The __clz intrinsic returns the number of leading zeros in val.有了__clz()函數(shù)我們就可以定義下面的MSB(x)宏來返回MSB比特(即從高到低第一個(gè)1)的位置。#define MSB(x) (31- __clz((unsigned int)x))注意這里默認(rèn)一個(gè)unsigned int占4個(gè)字節(jié)。用下面的循環(huán)我們可以快速遍歷一個(gè)unsigned int (即下面的bitmap)的1注意while里面的操作次數(shù)就是bitmap里面的1比特的個(gè)數(shù)。unsigned int bitmap 0x1234; while (bitmap) { int pos MSB(bitmap); //do something bitmap ~(0x1 pos); }如果n是2^k那么x % n x (n - 1)顯然后者更快。比如說33 % 8 33 7 1, 37 % 8 37 7 5Round up to the next highest power of 2from https://graphics.stanford.edu/~seander/bithacks.html#RoundUpPowerOf2unsignedintv;// compute the next highest power of 2 of 32-bit vv--;v|v1;v|v2;v|v4;v|v8;v|v16;v;從一個(gè)整數(shù)中提取 [start, start width) bit field意思是從 bit start 開始一共提取 width 個(gè) bitsbit 編號(hào)從最低位 0 開始核心公式field (value start) mask;其中mask (1U width) - 1U;Example:value 1101 0110提取[start, start width) [2, 6)也就是 bit [5:2]value 11 0101 10↑↑↑↑bits 5:2 0101代碼uint32_t value 0xD6U; /* 1101 0110 */unsigned start 2;unsigned width 4;uint32_t mask (1U width) - 1U;uint32_t field (value start) mask;value 2 0b1101 0110 2 0b0011 0101mask 0b00001111field (value start) mask 0b0101 5

相關(guān)新聞

生成式UI革命(2024Q3實(shí)測(cè)數(shù)據(jù)曝光):Figma+AI插件已讓原型交付效率提升680%

生成式UI革命(2024Q3實(shí)測(cè)數(shù)據(jù)曝光):Figma+AI插件已讓原型交付效率提升680%

更多請(qǐng)點(diǎn)擊: https://codechina.net 第一章:生成式UI革命的定義與核心范式躍遷 生成式UI革命并非簡(jiǎn)單地將大語言模型嵌入界面,而是重構(gòu)人機(jī)交互的根本契約:從“用戶驅(qū)動(dòng)指令”轉(zhuǎn)向“系統(tǒng)主動(dòng)協(xié)同生成”。其核心在于界面本身成為可…

2026/7/29 1:15:28 閱讀更多
AI 電動(dòng)竹火炬智能功率 MOSFET 完整選型方案

AI 電動(dòng)竹火炬智能功率 MOSFET 完整選型方案

AI 電動(dòng)竹火炬集成了智能照明、動(dòng)態(tài)色彩控制與電池管理,對(duì)功率 MOSFET 提出了高集成度、低功耗、高響應(yīng)速度的要求。微碧半導(dǎo)體(VBsemi)基于先進(jìn)的 Trench 工藝,為您提供覆蓋電機(jī)驅(qū)動(dòng)、燈光控制、電源管理的完整 AI 竹火炬功率解決…

2026/7/29 1:15:28 閱讀更多
智習(xí)室避坑指南:技術(shù)適配與合規(guī)性才是核心,天學(xué)網(wǎng)實(shí)測(cè)數(shù)據(jù)揭秘

智習(xí)室避坑指南:技術(shù)適配與合規(guī)性才是核心,天學(xué)網(wǎng)實(shí)測(cè)數(shù)據(jù)揭秘

【摘要】本文基于縣域中學(xué)、公立校及教培機(jī)構(gòu)的智習(xí)室落地實(shí)戰(zhàn)經(jīng)驗(yàn),深度拆解算法適配差、數(shù)據(jù)同步滯后、合規(guī)性不足三大高頻踩坑痛點(diǎn)。結(jié)合天學(xué)網(wǎng)智習(xí)室系統(tǒng)的實(shí)測(cè)數(shù)據(jù)與合規(guī)資質(zhì),用真實(shí)案例說明技術(shù)匹配度遠(yuǎn)比功能全面性重要,并提供分場(chǎng)景選…

2026/7/29 1:15:28 閱讀更多
IP地址與子網(wǎng)掩碼計(jì)算:網(wǎng)絡(luò)排錯(cuò)與規(guī)劃的必備基本功

IP地址與子網(wǎng)掩碼計(jì)算:網(wǎng)絡(luò)排錯(cuò)與規(guī)劃的必備基本功

1. 從一次真實(shí)的網(wǎng)絡(luò)故障說起:為什么IP計(jì)算是基本功那天下午,整個(gè)辦公室的網(wǎng)絡(luò)突然變得奇慢無比,部分同事甚至完全無法訪問內(nèi)部的文件服務(wù)器。作為團(tuán)隊(duì)里對(duì)網(wǎng)絡(luò)稍有了解的人,我被叫去幫忙。初步排查,路由器和交換機(jī)指示…

2026/7/29 4:56:04 閱讀更多
AI監(jiān)控濫用已致37起跨國訴訟:企業(yè)級(jí)倫理審查清單(含實(shí)時(shí)行為分析、情感識(shí)別、員工監(jiān)工三大禁區(qū))

AI監(jiān)控濫用已致37起跨國訴訟:企業(yè)級(jí)倫理審查清單(含實(shí)時(shí)行為分析、情感識(shí)別、員工監(jiān)工三大禁區(qū))

更多請(qǐng)點(diǎn)擊: https://kaifayun.com 第一章:AI監(jiān)控濫用已致37起跨國訴訟:企業(yè)級(jí)倫理審查清單(含實(shí)時(shí)行為分析、情感識(shí)別、員工監(jiān)工三大禁區(qū)) 全球范圍內(nèi),AI驅(qū)動(dòng)的職場(chǎng)監(jiān)控系統(tǒng)正引發(fā)前所未有的法律與倫理?!?/p>

2026/7/29 4:56:04 閱讀更多
Verilog計(jì)數(shù)器設(shè)計(jì)全解析:從基礎(chǔ)原理到高級(jí)應(yīng)用與避坑指南

Verilog計(jì)數(shù)器設(shè)計(jì)全解析:從基礎(chǔ)原理到高級(jí)應(yīng)用與避坑指南

1. 從“數(shù)數(shù)”到“時(shí)序控制”:計(jì)數(shù)器的核心價(jià)值在數(shù)字電路和FPGA/ASIC設(shè)計(jì)的世界里,計(jì)數(shù)器(Counter)可能是你接觸到的第一個(gè),也是貫穿整個(gè)職業(yè)生涯最基礎(chǔ)、最核心的時(shí)序邏輯電路。它遠(yuǎn)不止是“數(shù)數(shù)”那么簡(jiǎn)單。當(dāng)你需要…

2026/7/29 4:56:04 閱讀更多
CentOS 7 C語言開發(fā)環(huán)境搭建:從yum軟件包組到Hello World實(shí)戰(zhàn)

CentOS 7 C語言開發(fā)環(huán)境搭建:從yum軟件包組到Hello World實(shí)戰(zhàn)

1. 項(xiàng)目概述:在CentOS 7上構(gòu)建C語言開發(fā)環(huán)境很多剛接觸Linux系統(tǒng)編程的朋友,尤其是從Windows環(huán)境轉(zhuǎn)過來的,第一個(gè)攔路虎往往不是語法本身,而是“環(huán)境怎么搭”。在Windows下,你可能下載一個(gè)Visual Studio,安…

2026/7/29 4:56:04 閱讀更多
步進(jìn)電機(jī)驅(qū)動(dòng)器核心參數(shù)解析與實(shí)戰(zhàn)選型指南

步進(jìn)電機(jī)驅(qū)動(dòng)器核心參數(shù)解析與實(shí)戰(zhàn)選型指南

1. 項(xiàng)目概述:從“會(huì)轉(zhuǎn)”到“轉(zhuǎn)得好”的必經(jīng)之路提起步進(jìn)電機(jī),很多搞過單片機(jī)、玩過3D打印機(jī)或者DIY過一些小裝置的朋友肯定不陌生。它最大的特點(diǎn)就是“聽話”——給一個(gè)脈沖,它就轉(zhuǎn)一個(gè)固定的角度,開環(huán)控制,結(jié)構(gòu)簡(jiǎn)單&a…

2026/7/29 4:46:03 閱讀更多
面試官大笑:“一個(gè)任務(wù)拆給 5 個(gè) Subagent 并行跑,不比 1 個(gè)快 5 倍?“我搖頭:“快不了,還可能更慢“

面試官大笑:“一個(gè)任務(wù)拆給 5 個(gè) Subagent 并行跑,不比 1 個(gè)快 5 倍?“我搖頭:“快不了,還可能更慢“

前兩個(gè)月,我在重構(gòu) AlgoMooc 網(wǎng)站過程中,發(fā)現(xiàn)一個(gè)問題:在 Claude Code 里把一個(gè)任務(wù)拆給 5 個(gè) Subagent 并行跑,結(jié)果可能比 1 個(gè) agent 從頭干到尾還慢? 大多數(shù)人的第一反應(yīng)是反過來的:活是并行干的&#…

2026/7/29 0:15:24 閱讀更多
# 鴻蒙 HarmonyOS 應(yīng)用開發(fā)實(shí)戰(zhàn)(第25期)|骰子(Dice Roller)— Unicode 符號(hào)與動(dòng)畫渲染精講

# 鴻蒙 HarmonyOS 應(yīng)用開發(fā)實(shí)戰(zhàn)(第25期)|骰子(Dice Roller)— Unicode 符號(hào)與動(dòng)畫渲染精講

一、應(yīng)用概述 骰子(Dice Roller) 是一款經(jīng)典的休閑娛樂應(yīng)用,模擬了真實(shí)擲骰子的過程。應(yīng)用投擲兩個(gè)骰子(六面標(biāo)準(zhǔn)骰),使用 Unicode 骰面符號(hào)直觀展示每個(gè)骰子的點(diǎn)數(shù),并伴有快速滾動(dòng)的動(dòng)畫效果?!?/p>

2026/7/29 0:15:24 閱讀更多