位操作 bitwise operation (3)

链接:点名
题意
某班级 n 位同学的学号为 0 ~ n-1。点名结果记录于升序数组 records。假定仅有一位同学缺席,请返回他的学号。
Solution
1.任何数和0进行异或运算,结果为任何数。
2.任何数和自身进行异或运算,结果为0

class Solution {
public:
    int takeAttendance(vector<int>& records) {
    int n = records.size();
	int r = 0;
	for (int i = 0; i < n; i++) 
		r ^= (records[i] ^ i);
	return r ^ n;

    }
};

链接:位1的个数
题意
编写一个函数,输入是一个无符号整数(以二进制串的形式),返回其二进制表达式中数字位数为 ‘1’ 的个数(也被称为 汉明重量).)

class Solution {
public:
    int hammingWeight(uint32_t n) {
        int ret = 0;
        while (n) {
            n &= n - 1;
            ret++;
        }
        return ret;
    }
};

链接:检查按位或是否存在尾随零
题意
给你一个 正整数 数组 nums 。

你需要检查是否可以从数组中选出 两个或更多 元素,满足这些元素的按位或运算( OR)结果的二进制表示中 至少 存在一个尾随零。

例如,数字 5 的二进制表示是 “101”,不存在尾随零,而数字 4 的二进制表示是 “100”,存在两个尾随零。

如果可以选择两个或更多元素,其按位或运算结果存在尾随零,返回 true;否则,返回 false 。
Solution
与操作:全一为一,有零为零。即只有两个操作数都为1时,结果才为一,其他情况均为0.
根据and操作知,nums中需至少存在两个偶数。

class Solution {
public:
    bool hasTrailingZeros(vector<int> &nums) {
        int even = nums.size();
        for (int x: nums) {
            even -= x % 2;
        }
        return even >= 2;
    }
};
  • 9
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值