IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 【位运算题解3】 -> 正文阅读

[数据结构与算法]【位运算题解3】

LC中等题1

题目描述:461.汉明距离
两个整数之间的 汉明距离 指的是这两个数字对应二进制位不同的位置的数目。给定两个整数 X 和 y , 计算并返回它们之间的汉明距离

(1)1010 ^ 0011 = 1001
(2)相当于两个数进行异或运算 ,结果位1的个数,就是汉明距离

代码详解C++:

class Solution {
public:
    int hammingDistance(int x, int y) {
        int n = (x ^ y);
        int c = 0;       //计数器
        while(n) {
            n &= (n-1);  //进行与运算消去1
            ++c;
        }
        return c;
    }
};

### ! ! !

LC中等题2

题目描述:693. 交替位二进制数
给定一个正整数,检查它的二进制表示是否总是 0、1 交替出现:换句话说,就是二进制表示中相邻两位的数字永不相同。

(1)二进制11 = 十进制 3
(2)做法就是n不断右移1位,与11进行与运算,当结果为11或00的时候就说明存在两个相邻位置的数字是相同的。
(3)举例:当 n = 0101101 时,当右移两位后 n = 01011,这时01011 & 11 =3 ,这就检测出了相邻位相同的情况。

class Solution {
public:
    bool hasAlternatingBits(int n) {
        while(n) {
            if ((n & 3) == 3 || (n & 3) == 0) {
                return false;
            }
            n >>= 1;
        }
        return true;
    }
};

在这里插入图片描述

LC中等题3

题目描述:1863. 找出所有子集的异或总和再求和
给定一个整型数组,求出数组中每个子集的异或总和,计算并返回这些值相加之和。

思路:
(1) 集合子集数目是 2n 个,判断每个集合二进制1的位置,将该位置的数进行异或。
(2)将每个集合的异或结果进行相加。
举例:
在这里插入图片描述

int subsetXORSum(int* nums, int numsSize){
     int i, j, ans;
     int sum = 0;
     for (i = 0; i < (1 << numsSize); i++) {   //0 ~ 2^n -1 枚举每个子集
         ans = 0;
         for(j = 0; j < numsSize; j++){        //判断每个集合二进制数第0位到第n-1位之间1的位置
             if(i & (1<<j)) {
                 ans ^= nums[j];               //如果从低到高第j为1,就说明集合中存在nums[j]
             }
         }
         sum += ans;                           //将每个集合的异或值相加
     }
     return sum;
}

LC中等题4

题目描述:371. 两整数之和
给你两个整数 a 和 b ,不使用 运算符 + 和 - ???????,计算并返回两整数之和。

思路:
(1) 两数相加可以看成,带进位的加和加上不带进位的加和。
(2)不断进行递归,直到没有进位时,异或可以看成两数之和时,终止。
举例:
不带进位的加和: a ^ b = 1000 ^ 1010 = 0010
带进位加和的值:(a & b) << 1 = (1000 & 1010) << 1 = 10000

求:a + b = 10010,也就是:
在这里插入图片描述
由于需要一直进行加法,所以要不断通过递归进行,递归的终止条件是b=0,也就是没有进位,那么异或就是两数之和。

int getSum(int a, int b){
     return b == 0 ? a : getSum(a ^ b, (unsigned int)(a & b) << 1);
}

! ! !

LC中等题5

题目描述:面试题 05.01. 插入
给定两个整型数字 N 与 M,以及表示比特位置的 i 与 j(i <= j,且从 0 位开始计算)。
编写一种方法,使 M 对应的二进制数字插入 N 对应的二进制数字的第 i ~ j 位区域,不足之处用 0 补齐。

思路:
(1)先将N的 i ~ j 位都归 0,为N’
(2)再将M左移i位 与 N’ 进行 或运算
举例:
N = 1010101111 M = 101
将 N 的 i~j 位归 0,采用与运算,详细见代码吧😎
在这里插入图片描述

class Solution {
public:
    int insertBits(int N, int M, int i, int j) {
        int ans;
        for (int k = i; k <= j; k++) {
            N &= ~(1 << k);  //将第K位为0的数与N进行与运算,消去第k位的1
        }
        return N | (M << i);
    }
};

在这里插入图片描述

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-04-06 23:27:37  更:2022-04-06 23:30:01 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 10:03:02-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码