关于位运算符的实验

实验环境:

Win7 32位 vc++6.0


实验代码:

int main(int argc, char* argv[])
{
	unsigned char a = 0xA5;

	//1.
//	unsigned char b = (a=~a)>>4+1;
 	
	//2.
	unsigned char b = (~a)>>4+1;


	printf("b=%d\n", b);

	return 0;
}

实验结果:

第一种情况时,b=2

第二种情况时,b=250


实验分析:

1.汇编代码的比较

10:       unsigned char b = (a=~a)>>4+1;
0040102C   mov         eax,dword ptr [ebp-4]
0040102F   and         eax,0FFh
00401034   not         eax
00401036   mov         byte ptr [ebp-4],al
00401039   mov         ecx,dword ptr [ebp-4]
0040103C   and         ecx,0FFh
00401042   sar         ecx,5
00401045   mov         byte ptr [ebp-8],cl

11:       unsigned char b = (~a)>>4+1;
0040102C   mov         eax,dword ptr [ebp-4]
0040102F   and         eax,0FFh
00401034   not         eax
00401036   sar         eax,5
00401039   mov         byte ptr [ebp-8],al


2.对于第二种情况,寄存器EAX的值变化:000000A5->FFFFFF5A->07FFFFFA(FFFFFFFA)。理论上是前者,但在vc的寄存器中看是括号中的值,比较奇怪。

3.此实验要注意~a在寄存器中的运算,以及寄存器的位数32。

### 位运算符简介 位运算符是一种直接对整数在内存中的二进制位进行操作的工具。它广泛应用于优化程序性能以及处理低级硬件交互的任务中。以下是几种常见的位运算符及其功能说明[^3]。 #### 常见位运算符 1. **按位与 (`&`)** 对两个操作数的每一位执行布尔 `AND` 操作。如果对应位置上的两位均为 `1`,则结果为 `1`;否则为 `0`。 2. **按位或 (`|`)** 对两个操作数的每一位执行布尔 `OR` 操作。只要对应位置上有一个为 `1`,结果就为 `1`;只有当两者皆为 `0` 时,结果才为 `0`。 3. **按位异或 (`^`)** 如果对应的两比特不同,则该位的结果为 `1`;否则为 `0`。 4. **按位取反 (`~`)** 将操作数的每一个比特翻转,即将所有的 `1` 转换为 `0`,并将所有的 `0` 转换为 `1`。 5. **左移 (`<<`)** 左移操作会将操作数的所有比特向左移动指定的数量,并在右侧填充零。这相当于乘以 \(2^n\) 的效果(其中 \(n\) 是移动的位数)。 6. **右移 (`>>`)** 右移操作会将操作数的所有比特向右移动指定数量的位置。对于无符号整数来说,左侧用零填补;而对于有符号整数而言,取决于具体实现方式可能采用符号扩展或其他方法。 --- ### 示例代码展示 下面是一些具体的 Python 示例代码用于演示上述提到的各种位运算符的功能: ```python # 定义一些测试数据 a = 60 # 十进制表示形式下的数值 b = 13 # 同样也是十进制表示的形式 print(f"a = {bin(a)}") # 输出其二进制表现形式 print(f"b = {bin(b)}") # 执行各种类型的位运算并打印结果 c = a & b # 按位 AND 结果存储到 c 中 d = a | b # 按位 OR 存储至 d e = a ^ b # XOR 运算赋给 e f = ~a # NOT (取反) 应用于 f g = a << 2 # 把 a 的值整体往左边推移两次单位长度之后存入 g h = a >> 2 # 类似地把原变量名所指代的内容朝右边滑动同样距离后保存起来作为 h print("a & b =", bin(c), "=", c) print("a | b =", bin(d), "=", d) print("a ^ b =", bin(e), "=", e) print("~a =", bin(f), "=", f) print("a << 2 =", bin(g), "=", g) print("a >> 2 =", bin(h), "=", h) ``` 此段脚本能够帮助理解每种单独情况下如何应用这些基本概念以及观察最终得到的具体数值变化情况。 --- ### 注意事项 尽管位运算是非常强大的工具,在实际开发过程中应当谨慎使用它们。这是因为不当运用可能会降低可读性和维护难度。因此建议仅限于确实需要高效计算或者嵌入式编程等领域再考虑引入此类技术手段。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值