C语言位操作符

位运算符包含按位与(&)按位或(|)按位异或(^)左移(<<)右移(>>)按位取反(~)
以下所有示例均在32位机器中执行的

1. 按位与(&)、按位或(|)、按位异或(^)

操作数以int a = 3;int b = -5为例,对两个操作数分别进行不同的位操作
00000000 00000000 00000000 00000011 - 3补码
10000000 00000000 00000000 00000101 - -5原码
11111111 11111111 11111111 11111010 - -5反码
11111111 11111111 11111111 11111011 - -5补码

(1) 按位与(&):当两个操作数对应的二进制位均为1时,对应的二进制位为1,否则为0
int c = a & b;

000000000 00000000 00000000 00000011 —c的补码(3)

(2)按位或(|):当两个操作数对应的二进制位至少一个为1时,对应的二进制位为1,否则为0
int  c = a | b;

11111111 11111111 11111111 11111011 – c的补码
10000000 00000000 00000000 00000100 – c的反码
10000000 00000000 00000000 00000101 – c的原码(-5)

(3)按位异或(^):当两个操作数对应二进制位不同时为1;相同时为0
 int c = a ^ b

11111111 11111111 11111111 11111000 – c的补码
10000000 00000000 00000000 00000111 –c的反码
10000000 00000000 00000000 00001000 – c的原码(8)

按位异或的特点(a^a = 0,0^a = a)
练习题(在不创建临时变量的前提下,实现两个数的交换)

int a = 3;
int b = 5;
printf("交换前:a = %d,b = %d\n", a, b);
a = a ^ b; //a = 3^5
b = a ^ b; //3^5^5 --> b = 3
a = a ^ b; //3^5^3 --> a = 5
printf("交换后:a = %d,b = %d\n", a, b);

2. 左移(<<)、右移(>>)

移位操作符的操作数只能是整数

(1)左移操作符<<:将第一个操作数按位向左移动, 移动位数由第二个操作数指定,右边腾空位补0

int a = 7;int b = a << 1;为例
在这里插入图片描述
图1 左移操作符图示
结果b=14

(2)右移操作符>>:分为算术移位和逻辑移位两种,将第一个操作数按位向右移动, 移动位数由第二个操作数指定,左边腾空位有两种补位方法,第一种补原符号位,第二种补0

算术移位:左边腾空位补原符号位
int a = 7;int b = a >> 1为例
逻辑移位:左边腾空位补0
int a = 7;int b = a >> 1为例
在这里插入图片描述
图2 右移操作符图示

3.取反操作符(~)

操作数二进制序列中0置1,1置0
int a = 0;b = ~a;为例
00000000 00000000 00000000 00000000 – 0补码
11111111 11111111 11111111 11111111 – b的补码
10000000 00000000 00000000 00000000 – b的反码
10000000 00000000 00000000 00000001 – b的原码(-1)

下载方式:https://pan.quark.cn/s/a4b39357ea24 布线问题(分支限界算法)是计算机科学和电子工程领域中一个广为人知的议题,它主要探讨如何在印刷电路板上定位两个节点间最短的连接路径。 在这一议题中,电路板被构建为一个包含 n×m 个方格的矩阵,每个方格能够被界定为可通行或不可通行,其核心任务是定位从初始点到最终点的最短路径。 分支限界算法是处理布线问题的一种常用策略。 该算法与回溯法有相似之处,但存在差异,分支限界法仅需获取满足约束条件的一个最优路径,并按照广度优先或最小成本优先的原则来探索解空间树。 树 T 被构建为子集树或排列树,在探索过程中,每个节点仅被赋予一次成为扩展节点的机会,且会一次性生成其全部子节点。 针对布线问题的解决,队列式分支限界法可以被采用。 从起始位置 a 出发,将其设定为首个扩展节点,并将与该扩展节点相邻且可通行的方格加入至活跃节点队列中,将这些方格标记为 1,即从起始方格 a 到这些方格的距离为 1。 随后,从活跃节点队列中提取队首节点作为下一个扩展节点,并将与当前扩展节点相邻且未标记的方格标记为 2,随后将这些方格存入活跃节点队列。 这一过程将持续进行,直至算法探测到目标方格 b 或活跃节点队列为空。 在实现上述算法时,必须定义一个类 Position 来表征电路板上方格的位置,其成员 row 和 col 分别指示方格所在的行和列。 在方格位置上,布线能够沿右、下、左、上四个方向展开。 这四个方向的移动分别被记为 0、1、2、3。 下述表格中,offset[i].row 和 offset[i].col(i=0,1,2,3)分别提供了沿这四个方向前进 1 步相对于当前方格的相对位移。 在 Java 编程语言中,可以使用二维数组...
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值