Linux C ————11、位运算符和位运算

位运算是C语言提供的对二进制位的操作功能。它应用于整型数据,即把整型数据看成固定的二进制序列,让后对这些二进制序列进行一些按位运算。C语言提供了6中基本的位运算功能:按位与、按位或、取反、异或、左移、右移,下面将分别进行介绍:

按位与运算(&)

按位与运算是指对两个运算量相应的位进行逻辑与,“&”的运算规则与逻辑与“&&”相同。

运算规则:全1出1 ,否则出0

按位或运算(|)

按位或运算是指对两个运算量相应的位进行逻辑或,“|”的运算规则或逻辑或“||”相同

运算规则:有1出1,无1出0

取反运算(~)

按位取反运算是将二进制表示的预算对象按位取反,将1变为0,将0变为1.

异或运算(^)

按位异或运算的规则是:两个运算量相应位相同,则结果为0,相异则结果为1

移位运算(<<和>>)

左移和右移是吧整数作为二进制位序列,求出把这个序列左右移动若干位之后得到的序列。

<< 在Linux C/C++开发中,位运算是指对数据的二进制表示进行操作的一系列运算符技巧。它们直接操纵计算机内存中最基本的数据单位——位(bit),可以提高程序效率并节省存储空间,在嵌入式系统、算法优化等场景中有广泛应用。 ### 常见的位运算符 1. **按位与 (&)**: 只有两个相应的二进制位都为`1`时结果才为`1` - 示例:`5 & 3 = 0000 0101 & 0000 0011 = 0000 0001` 2. **按位或 (|)**: 当两个相应的二进制位有一个为`1`时结果就为`1` - 示例:`5 | 3 = 0000 0101 | 0000 0011 = 0000 0111` 3. **异或 (^)**: 若参与运算的两数同号则得零;不同号,则取正。 - 特点是可以用于交换变量值而不使用额外的空间以及翻转特定位置的状态。 - 示例:`5 ^ 3 = 0000 0101 ^ 0000 0011 = 0000 0110` 4. **左移 (<<) 右移 (>>)** : 将指定数字按照给定的数量向左/右边移动相应数量的位置,默认丢弃溢出部分且用零填充空缺处。(注意符号位处理) 5. **按位非 (~)** :将每一个比特位求反(`~x=-x-1`)。 - 注意这里的计算涉及到补码机制的理解 6. **无符号右移(>>>):** 在某些高级语言如Java中存在的概念, 对于C++, 整型默认采用算术右移的方式保留符号位不变地进行右移. ### 应用实例分析及代码示例: #### 检查奇偶性: ```cpp #include <iostream> using namespace std; bool isOdd(int num){ return (num&1)!=0; //如果最低位是'1', 则说明该整数为奇数. } int main(){ int number; cin >> number; cout << "The Number "<<number<<" is "; if(isOdd(number)) cout <<"ODD"; else cout <<"EVEN"; return 0; } ``` 这段简单的程序通过检查输入数值最末尾是否含有‘1’来快速判断其是不是一个奇数。 #### 快速幂模运算(modular exponentiation) 这是一种高效的指数运算方法,特别适用于大数乘方再取余的情况。它利用了平方倍增的思想配合到位运算加速过程。 ```cpp long long powerMod(long base,long exp,long mod) { long result=1; while(exp>0){ if((exp&1)==1){ //当当前次幂为奇数时执行相乘动作 result=(result*base)%mod; } base =(base * base ) % mod ;//更新基数到下一轮迭代所需的形式 exp >>=1;//除以2准备进入下一循环轮次 } return result; } ``` 此段代码实现了快速幂模运算的功能,能够有效减少不必要的重复计算量。 #### 设置、清除某个特定位: 假设我们想在一个8位字节上设置第n个标志位为“开”状态或者将其关闭掉,可以通过以下方式实现: ```cpp unsigned char setBit(unsigned char byte,int n){ return byte|(1U<<n); //开启第'n'位 } unsigned char clearBit(unsigned char byte ,int n ){ return byte & ~(1U<<n);//清空第'n'位 } ``` 以上只是其中几个简单例子展示如何运用这些运算符完成具体的任务。实际上还有很多其他有趣的用途等待探索!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

FLy_鹏程万里

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值