C++学习笔记(21)
1.集合是具有某种相同属性数据元素的整体;
结构是由不同属性数据元素组成的整体。
2.位运算通常是无符号整型数据。
3.掩码:
当一个整数(二进制)中只有一位为1时,称为掩码,通常借助掩码对数据按位进行测试。
4.变量a用变量b进行两次异或运算,原来的值不变。
由此得:
最快最方便最省资源进行交换两个数据的方法是进行三次异或运算:
a=a^b;
b=a^b;
a=a^b;
详细原理解释:
https://blog.csdn.net/weixin_30548917/article/details/97207267?spm=1001.2101.3001.6661.1&utm_medium=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-1.no_search_link&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-1.no_search_link
5.位运算要求数据类型为整型,但实际上按位操作数据,不会用类型去解释。
因此交换浮点型数据和大批量处理数据可以用指针方式。
例:
double a=123.456,b=456.123;
int *ap,*bq;
ap=(int*)(&a);
bp=(int*)(&b);//强制类型转换
*ap=(*ap)^(*bp);*bp=(*ap)^(*bp);*ap=(*ap)^(*bp);//先处理整数部分
ap++;bp++;//一个浮点型数据8个字节,一个整型指针4个字节,上一步指向整数部分,++后指向小数部分
*ap=(*ap)^(*bp);*bp=(*ap)^(*bp);*ap=(*ap)^(*bp);//然后处理小数部分
cout<<"a="<<a<<"\tb="<<b<<endl;
6.用位运算找出只有一个没有重复的数:
两个相同的数异或的结果是 0,一个数和 0 异或的结果是它本身,所以我们把这一组整型全部异或一下,例如这组数据是:1, 2, 3, 4, 5, 1, 2, 3, 4。其中 5 只出现了一次,其他都出现了两次,把他们全部异或一下,结果如下:
由于异或支持交换律和结合律,所以:
123451234 = (11)(22)(33)(44)5= 00005 = 5。
也就是说,那些出现了两次的数异或之后会变成0,那个出现一次的数,和 0 异或之后就等于它本身。
int find(int[] arr){
int tmp = arr[0];
for(int i = 1;i < arr.length; i++){
tmp = tmp ^ arr[i];
}
return tmp;
}
7.求解m的n次方
例如 n = 13,则 n 的二进制表示为 1101, 那么 m 的 13 次方可以拆解为:
m^1101 = m^0001 * m^0100 * m^1000。
我们可以通过 & 1和 >>1 来逐位读取 1101,为1时将该位代表的乘数累乘到最终结果。
public int getMultiplier(int m, int n) {
int sum = 1;
int tmp = m;
//对n进行移位,直到n的当前值为0
while (n != 0) {
//通过与0001相与得到最后一位,判断最后一位的值是否为1
if ((n & 1) == 1) {
sum = sum * tmp;
}
n = n >> 1;
//tmp不断相乘,相当于给每一位进行加权(8,4,2,1)
tmp *= tmp;
}
return sum;
}
高级用法参考:
https://blog.csdn.net/m0_37907797/article/details/103120886