【算法】--位运算
位运算
任何一个整数,在计算机底层一定是有三十二位信息的,就是任何一个整数都可以转化为三十二位的一个数
1.打印三十二位数(二进制)代码
#include <iostream>
using namespace std;//打印整数的32位(二进制)
void print(int num)
{for (int i = 31;i >=0; i--){cout << ((num & (1 << i)) == 0 ? "0" : "1");}cout << endl;
}int main()
{int num = 1;print(num);system("pause");return 0;
}
因为一与任何数都是1,所以就让1从第31位开始对mun的每一位数都与1,就可以输出mun的三十一位数了。
2.左移"<<"
左移就是将数整体向左移动一位,空缺的位用0补齐。
代码:
#include <iostream>
using namespace std;//打印整数的32位(二进制)
void print(int num)
{for (int i = 31;i >=0; i--){cout << ((num & (1 << i)) == 0 ? "0" : "1");}cout << endl;
}int main()
{/*int num = 1;print(num);*/int test = 1;print(test);print(test << 1);system("pause");return 0;
}

那么一个数字左移一位就等同于它乘了2,比如1是2的零次方,1左移一位就变成了2的一次方。
所以num << 1就等于num * 2
3.负数表示
三十二位信息按道理可以表示从0到2的32次方减一个数,但是在计算机系统中一个整型不是32位都使用,最高位会保留,真正表示的范围其实是从0位到三十位,所以整数真正能够表示的范围是0到2的31次方减一的范围(这样就正好是int的最大存储21亿多)。
最高位:
代码:
#include <iostream>
using namespace std;
#include <limits>//打印整数的32位(二进制)
void print(int num)
{for (int i = 31;i >=0; i--){cout << ((num & (1 << i)) == 0 ? "0" : "1");}cout << endl;
}int main()
{/*int num = 1;print(num);*//*int test = 3;print(test);print(test << 1);*/int a = std::numeric_limits<int>::max();cout << "int最大存储:" << a;cout << endl;print(a);system("pause");return 0;
}

最高位的作用:因为整型既能表示正数也能表示负数,所以如果是无符号的整型就可以用32位都表示整数范围就在0~2的32次方减一,有符号整数是将范围变为了-的2的31次方到正的2的31次方-1
正数的表达方式:最高位的符号位为0,后面哪一位有1就用二的次方加起来。
下图就是37的二进制
负数的表达方式:最高位的符号位为1,后面的状态取反然后再加1,
这个就是-475的二进制
当我们用十进制打印int的最大值和最小值时,最大值的绝对值要比最小值的绝对值小1,是因为0也需要占一位而且是包括在正数中的。
我们在代码中的加,减,乘,除,取模,都是在计算机内部转换为二进制然后通过位运算(| & ^ ~)进行计算的。



