常用的奇妙的小算法--不断更新中

     记得一些奇妙的小算法,代码不多,思路倒是很奇特,有的就是一些小的笔试题,特此记录一下:

1. 不用中间变量,如何交换两个变量的值?

    解决:这就要用到异或运算符了(并且这种方式不用考虑溢出哦)。

    a = a^b;
    b = a^b;
    a = a ^b;

2. 能够解决异常安全性的字符串赋值操作(C++)

    CMySring& CMyString::operator =(const CMyString &str){
        if(*this != str){
             CMyString strTemp(str);
                
                char *pTemp = strTemp.m_pData;
                strTemp.m_pData = m_pData;
                m_pData = pTempl
        }
        return *this;
    }

    这样写可以写可以防止在CMyString的拷贝构造函数构造strTemp的时候当内存不足的时候抛出异常,不会过早的改掉当前对象的m_pData,从而影响当前对象的不安全性;还有一点strTemp对象是一个局部对象,在脱离if的作用域时,会自动调用它的析构函数,来清理掉旧的对象用来保存数据的内存,和一些智能指针的实现类似。

3. 计算一个整数的二进制中有多少个1

    思路是:你将一个整数换算成二进制后,减去1后,它的第一个为1的位会变为0,改位的右方低位都会变为1,而该位的左方高位不变,在和它本身做与运算之后,从该位开始到所有的低位都为0,而该位的右方得以保留,如此循环,有几个1就做几次循环,举个例子画一画就一目了然了。

    int numberOf1(int n){
        int count = 0;
        
        while(n){
            count++;
            n = (n - 1) & n;
        }

        return count;
    }

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值