位运算常用总结

位运算应用口诀和实例 位运算应用口诀 清零取反要用与,某位置一可用或 若要取反和交换,轻轻松松用异或 移位运算 要点 1 它们都是双目运算符,两个运算分量都是整形,结果也是整形。 2 " >"右移:右边的位被挤掉。对于左边移出的空位,如果是正数则空位补0,若为负数,可能补0或补1,这取决于所用的计算机系统。 4 ">>>"运算符,右边的位被挤掉,对于左边移出的空位一概补上0。 位运算符的应用 (源操作数s 掩码mask) (1) 按位与-- & 1 清零特定位 (mask中特定位置0,其它位为1,s=s&mask) 2 取某数中指定位 (mask中特定位置1,其它位为0,s=s&mask) (2) 按位或-- | 常用来将源操作数某些位置1,其它位不变。 (mask中特定位置1,其它位为0 s=s|mask) (3) 位异或-- ^ 1 使特定位的值取反 (mask中特定位置1,其它位为0 s=s^mask) 2 不引入第三变量,交换两个变量的值 (设 a=a1,b=b1) 目 标 操 作 操作后状态 a=a1^b1 a=a^b a=a1^b1,b=b1 b=a1^b1^b1 b=a^b a=a1^b1,b=a1 a=b1^a1^a1 a=a^b a=b1,b=a1 二进制补码运算公式: -x = ~x + 1 = ~(x-1) ~x = -x-1 -(~x) = x+1 ~(-x) = x-1 x+y = x - ~y - 1 = (x|y)+(x&y) x-y = x + ~y + 1 = (x|~y)-(~x&y) x^y = (x|y)-(x&y) x|y = (x&~y)+y x&y = (~x|y)-~x x==y: ~(x-y|y-x) x!=y: x-y|y-x x >k&1 (3) 将int型变量a的第k位清0,即a=a&~(1 >16-k (设sizeof(int)=16) (6) int型变量a循环右移k次,即a=a>>k|a >1); } (8)判断一个整数是不是2的幂,对于一个数 x >= 0,判断他是不是2的幂 boolean power2(int x) { return ((x&(x-1))==0)&&(x!=0); } (9)不用temp交换两个整数 void swap(int x , int y) { x ^= y; y ^= x; x ^= y; } (10)计算绝对值 int abs( int x ) { int y ; y = x >> 31 ; return (x^y)-y ; //or: (x+y)^y } (11)取模运算转化成位运算 (在不产生溢出的情况下) a % (2^n) 等价于 a & (2^n - 1) (12)乘法运算转化成位运算 (在不产生溢出的情况下) a * (2^n) 等价于 a > n 例: 12/8 == 12>>3 (14) a % 2 等价于 a & 1 (15) if (x == a) x= b;    else x= a;    等价于 x= a ^ b ^ x; (16) x 的 相反数 表示为 (~x+1) 实例 功能 | 示例 | 位运算 ----------------------+---------------------------+-------------------- 去掉最后一位 | (101101->10110) | x >> 1 在最后加一个0 | (101101->1011010) | x 1011011) | x 101101) | x | 1 把最后一位变成0 | (101101->101100) | x | 1-1 最后一位取反 | (101101->101100) | x ^ 1 把右数第k位变成1 | (101001->101101,k=3) | x | (1 101001,k=3) | x & ~ (1 101101,k=3) | x ^ (1 101) | x & 7 取末k位 | (1101101->1101,k=5) | x & ((1 1,k=4) | x >> (k-1) & 1 把末k位变成1 | (101001->101111,k=4) | x | (1 100110,k=4) | x ^ (1 100100000) | x & (x+1) 把右起第一个0变成1 | (100101111->100111111) | x | (x+1) 把右边连续的0变成1 | (11011000->11011111) | x | (x-1) 取右边连续的1 | (100101111->1111) | (x ^ (x+1)) >> 1 去掉右起第一个1的左边 | (100101000->1000) | x & (x ^ (x-1)) 判断奇数 (x&1)==1 判断偶数 (x&1)==0
【顶级EI复现】计及连锁故障传播路径的电力系统 N-k 多阶段双层优化及故障场景筛选模型(Matlab代码实现)内容概要:本文介绍了名为《【顶级EI复现】计及连锁故障传播路径的电力系统 N-k 多阶段双层优化及故障场景筛选模型(Matlab代码实现)》的研究资源,重点围绕电力系统中连锁故障的传播机制,提出了一种N-k多阶段双层优化模型,并结合故障场景筛选方法提升系统安全性与鲁棒性。该模型通过Matlab代码实现,可用于模拟复杂电力系统在多重故障下的响应特性,支持对关键故障路径的识别与优化决策,适用于高水平科研复现与工程仿真分析。文中还列举了大量相关技术方向的配套资源,涵盖智能优化算法、电力系统管理、机器学习、路径规划等多个领域,并提供了网盘链接以便获取完整代码与资料。; 适合人群:具备电力系统、优化理论及Matlab编程基础的研究生、科研人员及从事能源系统安全分析的工程技术人员,尤其适合致力于高水平论文(如EI/SCI)复现与创新的研究者。; 使用场景及目标:①复现顶级期刊关于N-k故障与连锁传播的优化模型;②开展电力系统韧性评估、故障传播分析与多阶段防御策略设计;③结合YALMIP等工具进行双层优化建模与场景筛选算法开发;④支撑科研项目、学位论文或学术成果转化。; 阅读建议:建议读者按照文档提供的目录顺序系统学习,优先掌握双层优化与场景筛选的核心思想,结合网盘中的Matlab代码进行调试与实验,同时参考文中提及的智能算法与电力系统建模范例,深化对复杂电力系统建模与优化的理解。
<think>嗯,用户想了解位运算的使用方法和示例。首先,我需要回忆一下位运算的基础知识。位运算主要包括与、或、非、异或以及移位操作。每个运算符的作用是什么?比如,与运算(&)是按位进行与操作,只有两位都为1时才为1。或运算(|)则是任意一位为1就为1。非运算(~)是取反,异或(^)则是两位不同时为1,相同时为0。移位运算包括左移(<<)和右移(>>),左移相当于乘以2,右移相当于除以2,不过要注意符号位的问题。 接下来,用户可能需要具体的例子来理解这些运算。比如,使用与运算来判断奇偶性,因为二进制中最末位为1的话就是奇数,所以可以用x & 1的结果来判断。还有异或运算可以用来交换两个变量的值,而不需要临时变量,这个技巧挺常见的。另外,n & (n-1)可以去掉二进制中最右边的1,这在计算二进制中1的个数或者判断是否是2的幂时很有用。 用户可能还会关心位运算的应用场景。比如在嵌入式系统中,位操作常用于设置或清除特定的寄存器位,而不会影响其他位。这在硬件编程中很常见。另外,位运算还可以用于加密算法、数据压缩等领域,因为位操作速度快,能够提升效率。 不过,用户可能对位运算的优先级有疑问,比如运算符的优先级顺序是怎样的。比如,移位运算符的优先级通常低于算术运算符,但高于比较运算符。这时候需要提醒用户注意使用括号来明确运算顺序,避免错误。 另外,用户提到的引用中,有关于n = n & (n-1)的例子,这个操作可以用于计算二进制中1的个数。每次执行这个操作都会消除最右边的1,直到n变为0,执行的次数就是1的个数。这可能是一个需要详细解释的点。 还有用户可能想了解位运算的性能优势。由于位运算是直接对二进制位进行操作,通常比算术运算更快,因此在需要高性能的场景下,位运算可以优化代码。例如,引用[1]中提到时间复杂度O(logn)的情况下,使用位运算可能进一步优化。 需要确保回答的结构清晰,分点说明基本操作、常用技巧、应用场景和注意事项。同时,要给出具体的代码示例,比如C语言或Python中的例子,这样用户更容易理解。例如,使用C语言的位操作来设置标志位,或者用Python实现交换变量的值。 最后,用户可能对位运算的陷阱感兴趣,比如符号位处理在右移时的不同表现(算术右移还是逻辑右移),以及运算符优先级容易导致的错误。需要提醒用户在实际编码中注意这些问题,并通过测试验证。 总结一下,回答需要涵盖基本操作、常用技巧、应用场景、注意事项,并配以示例代码,同时引用提供的参考资料中的例子,如n & (n-1)的使用,确保回答全面且易于理解。</think>### 位运算的使用方法与示例 #### 一、位运算的基本操作 位运算直接操作二进制位,包含以下6种基本操作: 1. **与运算(&)** 两位同时为1时结果为1,否则为0。 示例: $5 \& 3$ → $0101 \& 0011 = 0001$ → 结果为1 应用:判断奇偶性($x \& 1$)、掩码操作[^4]。 2. **或运算(|)** 任意一位为1时结果为1。 示例: $5 | 3$ → $0101 | 0011 = 0111$ → 结果为7 应用:设置特定位为1(如权限控制)。 3. **非运算(~)** 按位取反(注意符号位)。 示例: $\sim 5$ → $\sim 0101 = 1010$(假设4位)→ 结果为-6(补码表示) 应用:快速取反特定标志位。 4. **异或运算(^)** 两位不同时结果为1。 示例: $5 \^ 3$ → $0101 \^ 0011 = 0110$ → 结果为6 应用:交换变量值(无需临时变量)[^3]。 5. **左移(<<)** 二进制位整体左移,低位补0。 示例: $5 << 1$ → $0101 → 1010$ → 结果为10 应用:快速计算$2^n$(如$1 << 4 = 16$)。 6. **右移(>>)** 二进制位整体右移,高位补符号位(算术右移)或0(逻辑右移)。 示例: $-8 >> 1$ → $11111000 → 11111100$ → 结果为-4(算术右移)。 --- #### 二、常用技巧与示例 1. **快速交换变量** ```c int a = 5, b = 3; a ^= b; // a = a ^ b b ^= a; // b = b ^ (a ^ b) → a a ^= b; // a = (a ^ b) ^ a → b ``` 结果:a=3, b=5[^3]。 2. **统计二进制中1的个数** ```c int count_ones(int n) { int count = 0; while (n != 0) { n &= (n - 1); // 每次消除最低位的1 count++; } return count; } ``` 示例:$n=12$(二进制1100)→ 经过两次操作后变为0 → 结果2。 3. **判断是否为2的幂** 若$n > 0$且$(n \& (n-1)) == 0$,则n是2的幂。 示例:$8 \& 7 = 0$ → 是2的幂;$7 \& 6 = 6$ → 不是。 4. **设置/清除特定位** ```c // 设置第k位为1 x |= (1 << k); // 清除第k位为0 x &= ~(1 << k); ``` 示例:设置x的第3位 → $x | 0x08$。 --- #### 三、应用场景 1. **嵌入式系统** 寄存器位操作(如GPIO控制)需直接操作特定位,避免影响其他位[^2]。 2. **加密与压缩算法** 异或运算用于简单加密,位掩码用于数据压缩。 3. **性能优化** 位运算比算术运算更快,如用左移代替乘2[^1]。 --- #### 四、注意事项 1. **运算符优先级** 位运算优先级低于算术运算,建议用括号明确顺序。例如: ```c (a & 0x0F) == 0x03 // 正确 a & 0x0F == 0x03 // 错误(==优先级高于&) ``` 2. **符号位处理** 右移时需区分算术右移(保留符号位)和逻辑右移(补0)。C语言中,对有符号数使用算术右移,无符号数使用逻辑右移。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值