【算法&数据结构初阶篇】:位运算

算法中很多情况下需要用到各种位运算的转换,比如>>右移、<<左移、&与等等,下面我们利用这些位运算来进行一个进制转换,将一个int整形(32位)十进制转二进制,以及其他的一些转换技巧。

目录

一、十进制转换成32位的二进制

核心点就是将1进行左移操作,从高位32位开始依次向低位0位移动,分别与所需转换的整形数值做与运算 

一、代码:

 二、代码解析:

二、位运算技巧

一、随用随记的特殊技巧

 二、计算演练

一、负数二进制,计算转换得到其十进制:

 三、用位运算实现加减乘除,不能用到+ - * /符号

一、代码演示


一、十进制转换成32位的二进制

核心点就是将1进行左移操作,从高位32位开始依次向低位0位移动,分别与所需转换的整形数值做与运算 

一、代码:

public void printBinary(int num){
    //高位从右到左遍历,打印
    for(int i = 31; i >= 0 ; i--){
        //数值第一轮是与高位1做与运算, 两者为1 与 得1,一个不为1 与 得 0 
        System.out.print(num & (1 << i) == 0 ? 0 : 1)
    }
}

 二、代码解析:

  • 转换二进制,需要知道打印方向,从高位到低位,即从左往右依次打印
  • &与运算的技巧,  1  1 得 1,非1 得 0,所以原数值,若为1 , 与运算后仍为 1, 若为 0, 与运算后仍为0

二、位运算技巧

一、随用随记的特殊技巧

System.out.println((~-5)+1);  //5   -5的相反数为5  取反+1 
System.out.println((~5)+1);   //-5   5的相反数为-5  取反+1 
System.out.println(-1>>>1);   //2147483647  无符号右移,忽略最高位的符号位,即用0补齐最高位
System.out.println(-1>>1);    //-1         带符号右移,负数最高位符号位是 1, 右移后仍用1补齐
printBinary(-1);                    //打印-1二进制  11111111111111111111111111111111

System.out.println(70 & 63);   // 6  即num % 64 等价与 num & 63 因为64二进制是1000000 模64后余数就是后六位的二进制数, 取后6位的技巧,与运算 111111  即 63  与运算1 1得1 这样就得到num的余数了 所以等价于模 
System.out.println(70 % 64);   // 6
System.out.println( 2 ^ 2 ) ; // 0  自己异或自己为0,异或运算,相同为0 不同为1,相当于 无进位相加

 二、计算演练

一、负数二进制,计算转换得到其十进制:

例如计算机中二进制:11111111111111111111111111111011 ,表示的十进制为 -5 ,计算机内存中保存的都是补码,这个要清楚

题目重述 本实验报告包含以下三个层次的任务: 初阶题:实现循环队列的初始化、判队空、判队满、进队、出队操作。 进阶题(汽车轮渡算法): 渡船每次载10辆车; 客车优先于货车; 每上4辆客车才允许上1辆货车; 若客车不足4辆,则用货车替代; 若无货车等待,允许全部客车上船。 要求模拟10辆及以上车辆过江。 高阶题(用栈实现队列逆置): 利用栈的&ldquo;先进后出&rdquo;特性与队列的&ldquo;先进先出&rdquo;特性; 将队列元素出队后依次入栈; 再将栈元素出栈后依次入队,实现队列逆置。 详解 初阶题:循环队列基本操作 需定义一个循环队列结构体,包含数据数组、队头指针 front、队尾指针 rear 和最大容量。关键在于利用模运算实现循环。 初始化:front = rear = 0 判空:front == rear 判满:(rear + 1) % MaxSize == front 入队:先存数据,再移动 rear = (rear + 1) % MaxSize 出队:取出 front 位置数据,再移动 front = (front + 1) % MaxSize 进阶题:汽车轮渡调度算法 使用两个队列分别存储客车和货车: Queue busQ: 存放客车 Queue truckQ: 存放货车 每次装船策略如下: 每次尝试装载最多10辆车; 按照&ldquo;4客车 + 1货车&rdquo;的比例上船; 若客车少于4辆,则补货车; 若无货车,则全上客车; 循环处理直到两队列均为空。 可通过计数器控制当前已上的客车数量(每4辆允许上1辆货车),并动态判断是否满足条件。 高阶题:用栈实现队列逆置 步骤清晰: 创建一个空栈; 将原队列中所有元素逐一出队,并压入栈中; 再将栈中所有元素逐一弹出,并重新入队; 结果即为原队列的逆序。 例如: 原队列:[A, B, C] (A最早入队) 出队入栈顺序:A&rarr;B&rarr;C,栈中为 [C, B, A](C在栈顶) 出栈入队顺序:C&rarr;B&rarr;A,新队列为 [C, B, A] 实现了队列逆置。 知识点 1. 循环队列的判空与判满机制 使用 (rear + 1) % maxSize == front 判断队满,避免假溢出,提高空间利用率。 2. 栈的后进先出与队列的先进先出结合应用 通过栈暂存队列元素,利用其反向特性完成队列逆置,体现数据结构间的互补性。 3. 多队列协同调度策略设计 在汽车轮渡问题中,采用分类队列+优先级规则实现复杂业务逻辑,提升系统仿真能力。 设计程序
最新发布
10-02
以下是针对设计程序实现循环队列的基本操作、汽车轮渡调度算法以及用栈实现队列逆置的详细代码: ### 循环队列的基本操作 ```python class CircularQueue: def __init__(self, capacity): self.capacity = capacity self.queue = [None] * capacity self.front = 0 self.rear = 0 self.size = 0 def is_empty(self): return self.size == 0 def is_full(self): return self.size == self.capacity def enqueue(self, item): if self.is_full(): print(&quot;Queue is full&quot;) return self.queue[self.rear] = item self.rear = (self.rear + 1) % self.capacity self.size += 1 def dequeue(self): if self.is_empty(): print(&quot;Queue is empty&quot;) return None item = self.queue[self.front] self.front = (self.front + 1) % self.capacity self.size -= 1 return item ``` ### 汽车轮渡调度算法 ```python def ferry_scheduling(vehicles): ferry = [] passenger_count = 0 truck_count = 0 while vehicles and len(ferry) &lt; 10: if vehicles[0] == &#39;P&#39;: ferry.append(vehicles.pop(0)) passenger_count += 1 if passenger_count % 4 == 0 and truck_count &lt; len([v for v in vehicles if v == &#39;T&#39;]): for i, v in enumerate(vehicles): if v == &#39;T&#39;: ferry.append(vehicles.pop(i)) truck_count += 1 break elif vehicles[0] == &#39;T&#39;: if passenger_count &lt; 4: ferry.append(vehicles.pop(0)) truck_count += 1 else: next_passenger_index = next((i for i, v in enumerate(vehicles) if v == &#39;P&#39;), None) if next_passenger_index is not None: ferry.append(vehicles.pop(next_passenger_index)) passenger_count += 1 else: ferry.append(vehicles.pop(0)) truck_count += 1 return ferry ``` ### 用栈实现队列逆置 ```python class Stack: def __init__(self): self.items = [] def is_empty(self): return len(self.items) == 0 def push(self, item): self.items.append(item) def pop(self): if self.is_empty(): return None return self.items.pop() def reverse_queue(queue): stack = Stack() while not queue.is_empty(): stack.push(queue.dequeue()) while not stack.is_empty(): queue.enqueue(stack.pop()) return queue ``` ### 测试代码 ```python # 测试循环队列 cq = CircularQueue(5) print(cq.is_empty()) # 输出: True cq.enqueue(1) cq.enqueue(2) print(cq.dequeue()) # 输出: 1 print(cq.is_full()) # 输出: False # 测试汽车轮渡调度算法 vehicles = [&#39;P&#39;, &#39;P&#39;, &#39;P&#39;, &#39;T&#39;, &#39;P&#39;, &#39;T&#39;, &#39;P&#39;, &#39;P&#39;, &#39;T&#39;, &#39;T&#39;, &#39;P&#39;, &#39;T&#39;] ferry = ferry_scheduling(vehicles) print(ferry) # 测试用栈实现队列逆置 cq = CircularQueue(5) cq.enqueue(1) cq.enqueue(2) cq.enqueue(3) reversed_queue = reverse_queue(cq) while not reversed_queue.is_empty(): print(reversed_queue.dequeue()) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值