有关位运算的笔记

一:按位与

特点:跟0与则得0,跟1与则保留原位。

应用:保留某些位(保留为取1),其余位清0(清0位取0)。实现此功能时,经常会用到16进制的f0,因为16进制中的1位即可表示二进制中的4位,而16进制中的f等效于二进制中的1111,十六进制中的0等效于二进制中的0000

举例:某数的二进制表示为            0000 0000  1000 0100  0000 0000  0010 0101

现在与十六进制的0xffffff00与    1111 1111  1111 1111   1111 1111  0000 0000

结果为                                           0000 0000  1000 0100  0000 0000  0000 0000

实现了低八位取0,高二十四位保留。

当要求的位数较具体时(不是类似于低八位,高八位这样的要求时),就不能使用16进制了。总之,记住特点就好办了。

二:按位非

特点:跟0非则保留原位,跟1非则得1

应用:保留某些位,其余位取1

三:按位异或

特点:跟1异或使原位取反,跟0异或保留。

应用:(1)使某些位取反,并保留其他位。

     (2)若a^b=c,c^b=ac^a=b,利用此特点可以不借助中间变量而实现两个数交换。

四:按位取反

特点:原来的0变为1,原来的1变为0

五:左移

特点:原有的高位舍弃,空出的低位补0。左移一位,就相当于乘2。但应注意的是,左移并不改变原来的数;

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

//程序目的:验证左移并不改变原来的数,且满足左移n位,乘2^n

//

//编程环境:vc6.0

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

#include<stdio.h>

void main()

{

int a=9;

int b=a<<1;

printf("%d   %d",a,b);

} 

 

左移操作比乘法操作快得多,所以当需要乘2的倍数时,可以考虑用左移。

六:右移

特点:原有低位舍弃,空出的高位用符号位填补(vc++下)。同样的,右移n位,则原来的数除以2^n,除不尽时往小里取。

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

//程序目的:验证右移n位,在原来的基础上除以2^n,并且在除不尽时,往小里取

//

//编程环境:vc6.0

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

#include<stdio.h>

void main()

{

int a=9;

int b=a>>1;

printf("%d   %d",a,b);

}

 

          

### **位运算基础笔记** #### **1. 基本位运算符** | 运算符 | 名称 | 描述 | 示例(`A=60=00111100`, `B=13=00001101`) | |--------|------------|----------------------|------------------------------------------| | `&` | **按位与** | 两位都为1时结果为1 | `A & B = 00001100` (12) | | `\|` | **按位或** | 两位有1时结果为1 | `A \| B = 00111101` (61) | | `^` | **按位异或** | 两位不同时结果为1 | `A ^ B = 00110001` (49) | | `~` | **按位取反** | 所有位取反(包括符号位) | `~A = 11000011` (-61,补码) | | `<<` | **左移** | 左移n位,低位补0 | `A << 2 = 11110000` (240) | | `>>` | **算术右移** | 右移n位,高位补符号位 | `A >> 2 = 00001111` (15) | | `>>>` | **无符号右移** | 右移n位,高位补0(仅部分语言) | `A >>> 2 = 00001111` (15) | --- #### **2. 常见用途** - **快速乘/除2的幂**:`x << n`(×2ⁿ),`x >> n`(÷2ⁿ) - **判断奇偶**:`if (x & 1)`(`1`=奇数,`0`=偶数) - **交换变量**(无临时变量): ```c a ^= b; b ^= a; a ^= b; ``` - **掩码操作**(提取特定位): ```c int low_4bits = x & 0xF; // 取低4位 ``` - **标志位管理**(设置/清除/切换位): ```c flags |= 0x1; // 设置第0位 flags &= ~0x1; // 清除第0位 flags ^= 0x1; // 切换第0位 ``` --- #### **3. 注意事项** - **符号位影响**:右移(`>>`)时高位补符号位,可能导致负数保持。 - **溢出风险**:左移可能丢失高位数据(如 `1 << 31` 在32位int中为负数)。 - **语言差异**: - **Python**:整数无限精度,左移不会溢出。 - **JavaScript**:`>>>` 是无符号右移,`>>` 是算术右移。 - **C/C++**:右移负数结果由实现定义(通常算术右移)。 --- #### **4. 性能优化** - **编译器优化**:现代编译器自动将 `x * 8` 转换为 `x << 3`。 - **低层控制**:嵌入式开发中常用位操作直接操控寄存器。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值