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)單地將大語(yǔ)言模型嵌入界面,而是重構(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 閱讀更多
基于金稅四期的財(cái)稅風(fēng)控規(guī)則引擎與業(yè)財(cái)一體化架構(gòu)實(shí)戰(zhàn)

基于金稅四期的財(cái)稅風(fēng)控規(guī)則引擎與業(yè)財(cái)一體化架構(gòu)實(shí)戰(zhàn)

隨著金稅四期全面上線,傳統(tǒng)財(cái)稅系統(tǒng)在面對(duì)海量高頻風(fēng)險(xiǎn)預(yù)警指標(biāo)時(shí),常因數(shù)據(jù)孤島和規(guī)則硬編碼導(dǎo)致合規(guī)響應(yīng)滯后。企業(yè)在進(jìn)行IPO財(cái)務(wù)規(guī)范或高企申報(bào)時(shí),業(yè)財(cái)數(shù)據(jù)不一致往往成為致命瓶頸。本文將結(jié)合高頓咨詢?cè)贐端財(cái)稅數(shù)字化領(lǐng)域的工程實(shí)踐&#…

2026/7/29 9:26:11 閱讀更多
Flexx桌面應(yīng)用安全加固實(shí)戰(zhàn):從代碼到部署的全面防護(hù)指南

Flexx桌面應(yīng)用安全加固實(shí)戰(zhàn):從代碼到部署的全面防護(hù)指南

1. 項(xiàng)目概述:為什么Flexx應(yīng)用需要特別的安全關(guān)注? 最近在社區(qū)里看到不少朋友開始用Flexx來開發(fā)桌面應(yīng)用,尤其是那些想把Web應(yīng)用打包成獨(dú)立桌面程序的項(xiàng)目。Flexx這個(gè)框架確實(shí)挺有意思,它讓你能用純Python寫前端界面,然…

2026/7/29 9:26:11 閱讀更多
Go與C語(yǔ)言面向?qū)ο缶幊虒?duì)比:結(jié)構(gòu)體、方法接收者與函數(shù)指針模擬類

Go與C語(yǔ)言面向?qū)ο缶幊虒?duì)比:結(jié)構(gòu)體、方法接收者與函數(shù)指針模擬類

1. 項(xiàng)目概述:當(dāng)Go遇上C,兩種“類”思維的碰撞在編程語(yǔ)言的演進(jìn)長(zhǎng)河中,面向?qū)ο缶幊?amp;#xff08;OOP)無疑是一座重要的里程碑。當(dāng)我們談?wù)摗邦悺睍r(shí),腦海中首先浮現(xiàn)的可能是Java、C這類以類為第一公民的語(yǔ)言。但今天&…

2026/7/29 9:26:11 閱讀更多
Arduino模擬信號(hào)與PWM控制:從電位器到LED亮度調(diào)節(jié)的完整實(shí)現(xiàn)

Arduino模擬信號(hào)與PWM控制:從電位器到LED亮度調(diào)節(jié)的完整實(shí)現(xiàn)

1. 從旋鈕到光暈:一個(gè)燈光調(diào)節(jié)器的誕生 最近在整理工作室的舊物,翻出來一塊吃灰已久的Arduino Edison開發(fā)板??粗?amp;#xff0c;我忽然想起很多朋友,包括當(dāng)年的我自己,在入門嵌入式開發(fā)時(shí),常常會(huì)卡在一個(gè)看似簡(jiǎn)單卻至…

2026/7/29 9:26:11 閱讀更多
國(guó)內(nèi)專業(yè)網(wǎng)站建設(shè)公司盤點(diǎn),2026 精選十家高口碑網(wǎng)站設(shè)計(jì)公司全方位梳理

國(guó)內(nèi)專業(yè)網(wǎng)站建設(shè)公司盤點(diǎn),2026 精選十家高口碑網(wǎng)站設(shè)計(jì)公司全方位梳理

一、2026 網(wǎng)站建設(shè)行業(yè)現(xiàn)狀深度解析生成式 AI、GEO 搜索優(yōu)化、llms 協(xié)議規(guī)范、多系統(tǒng)數(shù)據(jù)互通等新技術(shù)落地,市場(chǎng)對(duì)網(wǎng)站建設(shè)服務(wù)商的能力要求發(fā)生根本性分層。中大型企業(yè)、上市公司、出海品牌更青睞兼具行業(yè)深耕、定制開發(fā)、AI 營(yíng)銷配套、長(zhǎng)期運(yùn)維迭代能力的綜合服務(wù)…

2026/7/29 9:26:11 閱讀更多
Agent 平臺(tái)化思考:從定制化開發(fā)到通用 Agent 平臺(tái)的架構(gòu)演進(jìn)

Agent 平臺(tái)化思考:從定制化開發(fā)到通用 Agent 平臺(tái)的架構(gòu)演進(jìn)

Agent 平臺(tái)化思考:從定制化開發(fā)到通用 Agent 平臺(tái)的架構(gòu)演進(jìn) 一、從"一個(gè) Agent 一個(gè)項(xiàng)目"到"Agent 平臺(tái)":工程化必經(jīng)之路 2026 年初,某 SaaS 公司面臨一個(gè)困境:過去一年,他們?yōu)椴煌蛻粜枨箝_發(fā)了…

2026/7/29 9:16:11 閱讀更多
面試官大笑:“一個(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 閱讀更多