2021-12-7

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值