问题一:大端序与小端序
端序又叫字节序,是指存放多字节数据的字节的顺序,典型的情况是整数在内存中的存放方式和网络传输的传输顺序,大小端序跟硬件结构有关,与操作系统无关,例如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));
}
}