2014-4-14学习笔记

本文探讨了大端序与小端序的概念及其在内存中的表现形式,并提供了不使用加号实现两数相加及不用if else判断两数最大值的算法实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题一:大端序与小端序

端序又叫字节序,是指存放多字节数据的字节的顺序,典型的情况是整数在内存中的存放方式和网络传输的传输顺序,大小端序跟硬件结构有关,与操作系统无关,例如x86系列的pc机都是小端序。
例如一个long型的数据0x12345678 
大端序的字节顺序是0x12, 0x34, 0x56, 0x78,(内存顺序从左到右增大)
小端序的字节顺序是0x78, 0x56, 0x34, 0x12,(内存顺序从左到右增大)

问题二:写一个Add函数求两个数的和,不能加号或者别的算术运算符

对于两个数相加,我们通常的做法是从低位开始相加,然后考虑进位,然后加第二位,考虑进位,如此一致循环。

对于二进制我们可以使用同样的方法,对每一位求和,然后考虑进位。

例如计算759+674,不考虑进位得到323

计算759+674,只考虑进位得到1110

把上面两个数加起来。此时又要用到递归调用

不考虑进位的按位求和(0,0)0,(1,1)0 (0,1)1,(1,0)1,使用异或可以满足要求

只考虑进位 只有(1,1)才能进位,得1,使用与(&)可以满足要求,注意,当前位产生进位,要参数高一位的运算,必须向右移一位,递归求和,知道进位为0

public class test2 {
	public static int Add(int a,int b){
		if(b==0)return a;
		int sum=a^b;
		int carry=(a&b)<<1;
		return Add(sum,carry);
	}
	public static void main(String[] args) {
		int num1=10,num2=11;
		System.out.println(Add(num1,num2));
	}
}

问题三 写一个Max函数,判断两个数中较大的数,不能使用if esle

令z=a-b; 当a>b时,z为正数,最高位为0,所以两者中较大的数是a-kz=a

当a<b时,z为负数,最高位为1,所以两者中较大的数是a-kz=b

代码如下:

public class test2 {
	public static int Max1(int a,int b){
		int z=a-b;
		int k=(z>>31)&1;
		return a-k*z;
	}
	public static void main(String[] args) {
		int num1=10,num2=11;
		System.out.println(Max1(num1,num2));
	}
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值