机器语言 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;
}
}