• 常用位操作


    191. 位1的个数 - 力扣(LeetCode)

    231. 2 的幂 - 力扣(LeetCode)

    136. 只出现一次的数字 - 力扣(LeetCode)

    268. 丢失的数字 - 力扣(LeetCode)

    常用位操作: 与(&)、 或( | )、 异或( ^ )  

    原理:ASCII码

    1.利用操作 | 和空格将英文字符转换为小写

    1. ( 'a' | ' ' ) = 'a';
    2. ( 'A' | ' ' ) = 'a';

    2.利用操作 & 和下划线将英文字符转换为大写 

    1. ( 'b' & '_' ) = 'B'
    2. ( 'B' & '_' ) = 'B'

    3.利用异或操作 ^ 和空格进行英文字符大小写互换 

    1. ( 'd' ^ ' ' ) = 'D'
    2. ( 'D' ^ ' ' ) = 'd'

    4.判断两个数是否异号

    原理:补码的符号位,负数是1,正数是0,异号数相与是负数,同号数相与是正数)

    1. int x = -1, y = 2;
    2. boolean f = ((x ^ y) < 0); // true
    3. int x = 3, y = 2;
    4. boolean f = ((x ^ y) < 0); // false

    5.不用临时变量来交换两个数

    1. int a=1,b=2;
    2. a^=b;
    3. b^=a;
    4. a^=b;//现在a=2,b=1

     

    191.位1的个数

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

    示例 1:

    输入:00000000000000000000000000001011
    输出:3
    解释:输入的二进制串 00000000000000000000000000001011 中,共有三位为 '1'。

    原理:n&( n-1),可以消除n的二进制表示中的最后一个1

    1. class Solution {
    2. public:
    3. int hammingWeight(uint32_t n) {
    4. int res=0;
    5. while(n!=0)//循环至n为0
    6. {
    7. n=n&(n-1);//n与n-1,可以消除n的二进制表示中的最后一个1
    8. res++;
    9. }
    10. return res;
    11. }
    12. };

    231.2的幂

    给你一个整数 n,请你判断该整数是否是 2 的幂次方。如果是,返回 true ;否则,返回 false 。

    如果存在一个整数 x 使得 n == 2^x ,则认为 n 是 2 的幂次方。

    示例 1:

    输入:n = 1
    输出:true
    解释:2^0 = 1
    示例 2:

    输入:n = 16
    输出:true
    解释:2^4 = 16

    原理:n&(n-1)可以消除n的二进制表示的最后一个1,2的幂次方的二进制表示有且只有一个1

    1. class Solution {
    2. public:
    3. bool isPowerOfTwo(int n) {
    4. if(n<=0)//n<=0时,肯定不是2的幂次方
    5. return false;
    6. //n&(n-1)可以消除n的二级制表示中的最后一个1
    7. n=n&(n-1);//因为2的幂次方的二级制表示只有一个1,所以操作一次后判断是否为0
    8. return n==0?true:false;
    9. }
    10. };

    136.只出现一次的数字

    给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。

    说明:

    你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?

    示例 1:

    输入: [2,2,1]
    输出: 1
    示例 2:

    输入: [4,1,2,1,2]
    输出: 4

    原理:a ^ a = 0,a ^ 0 = a(奇数个a异或等于它本身,偶数个a异或等于0)

    1. class Solution {
    2. public:
    3. int singleNumber(vector<int>& nums) {
    4. int res=0;
    5. for(int i:nums)//数组内所有数做异或,出现两次的异或成0,出现一次的最后和0做异或,等于它本身
    6. {
    7. res=res^i;//a异或a=0,a异或0=a(奇数次的a异或等于它本身,偶数次的a异或等于0)
    8. }
    9. return res;
    10. }
    11. };

    286.丢失的数字

    给定一个包含 [0, n] 中 n 个数的数组 nums ,找出 [0, n] 这个范围内没有出现在数组中的那个数。

    示例 1:

    输入:nums = [3,0,1]
    输出:2
    解释:n = 3,因为有 3 个数字,所以所有的数字都在范围 [0,3] 内。2 是丢失的数字,因为它没有出现在 nums 中。

    思路一:求出1~n的总和,再减去nums中所有元素的总和,就得到了丢失的那个数字

    1. class Solution {
    2. public:
    3. int missingNumber(vector<int>& nums) {
    4. int n=nums.size();
    5. int sum=(1+n)*n/2;//利用求和公式对1~n求和
    6. int acu=accumulate(nums.begin(),nums.end(),0);
    7. return sum-acu;
    8. }
    9. };

    思路二:a ^ a = 0,a ^ 0 = a(奇数个a异或等于它本身,偶数个a异或等于0)

    res和元素个数n异或,然后再和nums中的每个元素及其下标异或,最后就得到了缺的那个

    例子:

    nums=[3,0,1] , n=3 , res=0

    res = res ^ 3 ^ 3 ^ 0 ^ 0 ^ 1 ^ 2 ^ 1 = res ^ 3 ^ 3 ^ 0 ^ 0 ^ 1 ^ 1 ^ 2 = 0 ^ 2 = 2 

    1. class Solution {
    2. public:
    3. int missingNumber(vector<int>& nums) {
    4. int n=nums.size();
    5. int res=0;
    6. res^=n;
    7. for(int i=0;i
    8. {
    9. res^=i^nums[i];
    10. }
    11. return res;
    12. }
    13. };
  • 相关阅读:
    jmeter接口压力测试-(二)
    105份墨天轮“国产化迁移”精品文档汇总(含TiDB、openGauss、上云等)
    Centos7安装GBase8a V9.5
    Linux系统的常见变种、发行版有哪些 Debian,CentOS等
    C语言之排序
    核酸采样机器人在上海问世;顺丰同城试点无人机急送服务;汽车行业董事长薪酬榜出炉;
    初识51单片机
    计算机毕设 基于时间序列的股票预测于分析
    Excel中使用ROW函数自动更新行号或编号
    Java18知多少
  • 原文地址:https://blog.csdn.net/weixin_50437588/article/details/126728594