记录进制和计算

机器语言 0101

进制

进制:逢几进几  例如:二进制 逢二进一

进制的思想:无论什么进制 都有一套属于自己的计算体系!

运算

运算的本质就是查数

减法的本质就是加法  111-11 = 111+(-11)

除法的本质就是乘法 除数×哪个数最接近结果即可

位运算


^异或运算:相同为0,不同为1(无进位相加)

0^N=N N^N=0         0和任何一个数异或等于那个数 任何一个数和自己异或等于0

异或运算满足交换律、结合律

a^b=b^a       (a^b)^c=a^(b^c)

同一批数异或不管谁先谁后 最后的结果都是一样的

一个数与上自己取反+1 取最右侧的1

a&(~a+1)

a:1010111100

~a:0101000011

~a+1:0101000100

a&(~a+1):0000000100

位运算加减乘除


计算机只认识 0  1

基本数学是建立在加减乘除 (加法)

4+5?

# 计算机是怎么操作的

0000 0100

0000 0101

--------------(加法:计算机是不会直接加的)

0000 1001

#计算机的实现原理

#第一步:异或:如果不考虑进位,异或就可以直接出结果

0000 0100

0000 0101

--------------

0000 0001

#第二步:与运算(判断进位 如果与运算结果位0 没有进位)

0000 0100

0000 0101

-----------------

0000 0100

#第三步:将与运算结果 左移一位  0000 1000 进位的结果

#第四步:异或

0000 0001

0000 1000

---------------

0000 1001

#第五步:与运算(判断进位 如果与运算结果位0 没有进位)

0000 0001

0000 1000

---------------

0000 0000

#所以最终的结果就是与运算为0的结果的上一个异或运算

位运算 加法

//两数之和位运算---正整数
public class Numsum {
	
	public static int getSum(int a, int b) {
		int c = a^b;
		int d = a&b;
		while(d != 0) {
			d = d << 1;
			a = c;
			c = d^c;
			d = d&a;
		}
		return c;
	}

}

位运算 减法

//两数之差---正整数
public class Numdifference {

	public static int getDifference(int a, int b) {
		b = ~b+1;
		int c = a^b;
		int d = a&b;
		while(d != 0) {
			d = d << 1;
			a = c;
			c = d^c;
			d = d&a;
		}
		return c;
	}
	
}

位运算 乘法

//位运算乘法---正整数
public class Nummultiply {
	public static int getMultiply(int a, int b) {
		int e = a;
		int c = a^a;
		int d = a&a;
		for(int i=1;i<b-1;i++) {
			while(d != 0) {
				d = d << 1;
				a = c;
				c = d^c;
				d = d&a;
			}
			c = c^e;
			d = c&e;
		}
		
		return c;
	}

}

猜你喜欢

转载自blog.csdn.net/qq_45304571/article/details/120289106