E-Dreamer

脚踏实地,仰望星空

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

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

 

posted on 2020-04-19 20:12  E-Dreamer  阅读(310)  评论(0编辑  收藏  举报