zoukankan      html  css  js  c++  java
  • 基础算法——位运算

    /*************************************************************************
        > File Name: bits.cpp
        > Author: xinyang
        > Mail: xuechen.xy@gmail.com 
        > Created Time: Wed 07 Oct 2015 03:00:22 PM CST
     ************************************************************************/
    
    #include <iostream>
    using namespace std;
    
    /*
     * n中二进制位1的个数
     */
    int num_of_1_1(int n) {
        int count = 0;
        unsigned int flag = 1;
        while (flag) {
            if (n & flag) {
                ++count;
            }
            flag <<= 1;
        }
        return count;
    }
    
    int num_of_1_2(int n) {
        int count = 0;
        while (n) {
            n = (n - 1) & n;
            ++count;
        }
        return count;
    }
    
    /*
     * 找出数组中只出现1次的两个数字
     */
    unsigned int find_first_bit1(int num) {
        int idx1 = 0;
        while (((num & 1) == 0) && (idx1 < 8 * sizeof(int))) {
            num >>= 1;
            ++idx1;
        }
        return idx1;
    }
    
    bool is_bit1(int num, unsigned int idx1) {
        num = num >> idx1;
        return (num & 1);
    }
    
    void find_nums_appear_once(int A[], int n, int &num1, int &num2) {
        if (A == NULL || n <= 2) {
            return;
        }
    
        int exclusive_or = 0;
        for (int i = 0; i < n; ++i) {
            exclusive_or ^= A[i];
        }
    
        unsigned int idx1 = find_first_bit1(exclusive_or);
        
        num1 = num2 = 0;
        for (int i = 0; i < n; ++i) {
            if (is_bit1(A[i], idx1)) {
                num1 ^= A[i];
            } else {
                num2 ^= A[i];
            }
        }
    }
    
    int main() {
        cout << "number of 1 in an integer" << endl;
        // cout << num_of_1_1(6) << endl << endl;
        cout << num_of_1_2(6) << endl << endl;
    
        cout << "find two numbers appear only once in an array" << endl;
        int num1, num2;
        int A[] = {2, 4, 3, 6, 3, 2, 5, 5};
        find_nums_appear_once(A, 8, num1, num2);
        cout << num1 << " " << num2 << endl << endl;
    
        return 0;
    }
  • 相关阅读:
    CCNA 第二章 以太网回顾
    CCNA 第一章 网络互联
    solidworks中 toolbox调用出现未配置的解决方法
    linux之df命令
    linux之du命令
    linux之pid文件
    linux之mysql启动问题
    linux之使用cron,logrotate管理日志文件
    wordpress(一)wordpress环境的搭建
    phpwind8.7升级9.0.1过程(四)20130207升级到20141228
  • 原文地址:https://www.cnblogs.com/yiyi-xuechen/p/4858774.html
Copyright © 2011-2022 走看看