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

算法中很多情况下需要用到各种位运算的转换,比如>>右移、<<左移、&与等等,下面我们利用这些位运算来进行一个进制转换,将一个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
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值