• 位运算在编程题的一些作用


    PS:本帖记录一些在刷题过程中的作用与技巧。 

    1.位运算(与运算)判断奇偶

    num & 1 == 1 : 判断为奇数; 

    num & 1 == 0 :   判断为偶数。 

    2.位运算(异或运算)交换 两个数的值。 

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

    3.位运算(异或运算)找到数组中出现一次的数

    class Solution {
    public:
    	void FindNumsAppearOnce(vector<int> data, int* num1, int* num2) {
    		int length = data.size();
    		if (length == 2) {
    			*num1 = data[0];
    			*num2 = data[1];
    			return;
    		}
    		int bitResult = 0;
    		for (int i = 0; i < length; ++i) {
    			bitResult ^= data[i];    // 全体异或
    		}
    		int index = findFirst1(bitResult); // 找到第一个位为1的数
    		for (int i = 0; i < length; ++i) {
    			if (isBit1(data[i], index)) {   // 查看当前数的index位是不是1 
    				*num1 ^= data[i];
    			}
    			else {
    				*num2 ^= data[i];
    			}
    		}
    	}
    	int findFirst1(int bitResult) {
    		int index = 0;    // 注意这里是第0 位开始,java是第一位
    		while ((bitResult & 1) == 0 && index < 32) {   // 找到第一位1 
    			bitResult >>= 1;   // 右移一位
    			index++; 
    		}
    		return index; 
    	}
    
    	bool isBit1(int target, int index) {
    		return ((target >> index) & 1) == 1;
    	}
    };
    

    4.位运算求整数的绝对值

      abs(num) = (num ^ (num >> 31)) - (num  >> 31)  (注:本人太菜,这里就不推导了) 

    5.位运算(异或、与运算)实现加法(例:不使用加法实现两数相加)

    class Solution {
    public:
        int Add(int num1, int num2)
        {
            while (num2 != 0) {  // 进位值为0 跳出循环
                int temp = num1 ^ num2; // 得到二进制的相加
                num2 = (num1 & num2) << 1;   // 得到二进制的进位
                num1 = temp;
            }
            return num1;
        }
    };
    

    6.位运算和二进制的一些操作

    见:https://www.cnblogs.com/E-Dreamer-Blogs/p/12184698.html

  • 相关阅读:
    Linux 系统使用eclipse时顶部菜单栏不见解决办法
    DES 文件加密解密
    Java 做CRC -CCITT x16+x12+x5+1(0x1021),初值为0x0000 校验
    字节流排序低字节在前高字节在后
    burpsuite暴力破解之四种方式
    网络安全之信息收集部分内容
    渗透测试步骤
    PHP与Mysql之间的纠缠(超详细)
    MySQL知识汇总
    PHP文件上传、错误处理
  • 原文地址:https://www.cnblogs.com/E-Dreamer-Blogs/p/12733233.html
Copyright © 2020-2023  润新知