位运算左移、右移、按位取反

2023-05-16

                                                                     

目录

一、异或习题补充

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

二、位运算左移

1.概念

1)二进制形态

2)执行结果

3)负数左移的执行结果

4)左移负数位

5)左移溢出

2.应用

1)取模转换为位运算

2)生成标记码

a.标记位置1

b.标记位置0

c.标记位取反

3.习题

1).190. 颠倒二进制位 - 力扣(LeetCode)

2)231. 2 的幂 - 力扣(LeetCode)

3)476. 数字的补数 - 力扣(LeetCode)

4)338. 比特位计数 - 力扣(LeetCode)

三、位运算右移

1.概念

1)二进制形态

2)执行结果

3)负数右移

4)右移负数位

2.应用

1)去掉低k位

2)取低位连续1

3)取第k位的值

3.习题

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

2.231. 2 的幂 - 力扣(LeetCode)​​​​​​

3.342. 4的幂 - 力扣(LeetCode)

4.405. 数字转换为十六进制数 - 力扣(LeetCode)

四、位运算按位取反

1.概念

2.应用

 1)0的取反

a)有符号整型

b)无符号整型

 2)相反数

3)代替减法

4)代替加法

3.题目


一、异或习题补充

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

class Solution {
public:
    vector<int> singleNumber(vector<int>& nums) {
long long xornum=0;
for(int num:nums)
{
    xornum^=num;
}
long long mask=xornum & (-xornum);//负数的二进制形式在电脑中以补码存在,补码=反码+1. 都是1时为1. 取最后一个二进制位为1的数字。
int a=0,b=0;
for(int num:nums)
{//把数组分为两组。  最后那两个数位或的最低位为1,肯定有一个数的二进制位是1,另一个是0.
    if((num&mask)==0)
    a^=num;
    else
    b^=num;
}

return {a,b};
}
};

2.861. 翻转矩阵后的得分 - 力扣(LeetCode)

3.1442. 形成两个异或相等数组的三元组数目 - 力扣(LeetCode)

二、位运算左移

1.概念

1)二进制形态

x<<y

表示将x左移y位,这里的位是二进制位。

在尾部添y个0

2)执行结果

x<<y的执行结果等价于:x * 2^{y}

注意:常用当x=1时,1<<y表示 2的幂

3<<5   即3*2^5  96
011   01100000  1*2^5+1*2^6=96

3)负数左移的执行结果

- (x << y)  和 (-x) << y 等价

4)左移负数位

32<<-1 //16
32<<-5 //0
32<<-6 //0

左移负数位与右移对应正数数值位一致

5)左移溢出

溢出会回来。2^{32}取余。

0b10000000000000000000000000000001;
//输出为-2147483647
左移1位。得到最高位的1被移除去,最低位补0。0b10  2

2.应用

1)取模转换为位运算

x%(pow(2,y))  可以转换为位与2^{y}-1

x&((1<<y)-1)

2)生成标记码

a.标记位置1

x,对它二进制位的第k位置为1(从0开始,从低到高数)

  • x|(1<<k)
  • 位或运算。位或1,结果1;位或0,结果不变。

b.标记位置0

x,对它二进制位的第k位置为0(从0开始,从低到高数)

  • x &(~(1<<k))
  • 第k位为0,其他位为1, ~(1<<k)
  • 位与运算:位与0,结果0;位与1,结果不变。

c.标记位取反

x,对它二进制位的第k位置为取反(从0开始,从低到高数)

  • x^(1<<k)
  • 异或运算:异或1,结果取反;异或0,结果不变

3.习题

1).190. 颠倒二进制位 - 力扣(LeetCode)

class Solution {
public:
    uint32_t reverseBits(uint32_t n) {
        uint32_t rev = 0;//与0异或为本身。
        for (int i = 0; i < 32 && n > 0; ++i) {
            rev ^= ((n & 1) << (31 - i));//n&1判断n的奇偶性,即看n的末位为0还是1
            n >>= 1;
        }
        return rev;
    }
};

2)231. 2 的幂 - 力扣(LeetCode)

class Solution {
public:
    bool isPowerOfTwo(int n) {
if(n<=0)
return false;

if((n&(n-1))==0)
return true;

return false;
    }
};
class Solution {
public:
    bool isPowerOfTwo(int n) {
if(n<=0)
return false;
for(int i=0;i<32;i++)
{
    if(1<<i==n)
    return true;
}

return false;
    }
};

3)476. 数字的补数 - 力扣(LeetCode)

class Solution {
public:
    int findComplement(int num) {
        //题干中整数与它的补数相加为n个1,n为整数的二进制位数。
long long ans=1;
while(ans<=num)
{
    ans<<=1;//转换为二进制: num有几位,ans就有几个0,头是1 
}
return ans-1-num;
    }
};

4)338. 比特位计数 - 力扣(LeetCode)

class Solution {
public:
    vector<int> countBits(int n) {
        vector<int> ans(n+1);
for(int i=0;i<=n;i++)
{
    int b=i;
    while(b)//一定要舍一个中间量=i,不然i的值每次都会归于0
    {
         ans[i]+=b&1;
         b>>=1;
    }

}
return ans;
    }
};

三、位运算右移

1.概念

1)二进制形态

  • x>>y
  • 将x右移y位;
  • 对于正数,右移y位;对于负数,右移y位后,高位补1

2)执行结果

等价于   floor( \frac{x}{2^{y}})     floor是向下取整

0b1010111>>3  
1010 即10

3)负数右移

- (x>>y)  等价于 (-x)>>y

4)右移负数位

右移尽量不用负数,会报错,但是运行结果正确。

2.应用

1)去掉低k位

x,去掉它的低k位,输出

x>>k

2)取低位连续1

获取x地位连续的1并且输出

(x^(x+1))>>1

    图源:英雄哪里出来

3)取第k位的值

获取一个数x的第k位的值并输出

(x>>k)&1

3.习题

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

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

2.231. 2 的幂 - 力扣(LeetCode)​​​​​​

bool isPowerOfTwo(int n){
    int i;
    if(n <= 0) {
        return false;
    }
    while(1) {
        if(n == 1) {
            return true;     // 1在最高位。
        }
        if(n & 1) {
            return false;    // 1出现在非最高位上
        }
        n >>= 1;           
    }
    return false;
}

3.342. 4的幂 - 力扣(LeetCode)

class Solution {
public:
    bool isPowerOfFour(int n) {
   return n > 0 && (n & (n - 1)) == 0 && n % 3 == 1;
    }//n&(n-1)==0 证明n为偶数。 n%3==1  n是4的倍数。
};

4.405. 数字转换为十六进制数 - 力扣(LeetCode)

class Solution {
public:
    string toHex(int num) {
        if (num == 0)
            return "0";
        string ans = "0123456789abcdef";  // 0-15映射成字符
        unsigned int n = num;        // 转为为非符号数,不让符号位参与计算
        string res = "";
        while (n > 0)
        {
            res += ans[n%16]; //n%16也可以写成n&15
            n >>= 4;  //即 n/=16;
        }
        reverse(res.begin(),res.end());
        return res;
    }
};

四、位运算按位取反

1.概念

~x

操作数取反结果
10
01

取反是对32位二进制整数取反。

2.应用

 1)0的取反

  • 答案:应该是32个1,  即2^{32}-1,但是实际输出却是-1.
  • 原因:C++和C语言中有两种类型的 int ,分别为unsigned int 和 signed int  ,int是signed int 的简称。

a)有符号整型

         signed int ,最高位表示符号位,所以只有31位能表示数值,能够表示的数值范围是:

                                                    -2^{31}\leq x\leq 2^{31}-1

对于有符号整型,printf输出用%d

b)无符号整型

   unsigned int ,不需要符号位,所以32位能表示数值,能够表示的数值范围是:

                                                    0\leq x \leq 2^{32}-1

对于无符号整型,printf输出用%u

 2)相反数

 利用补码的定义,对于正数x,它的相反数的补码就是x二进制取反+1(补码=反码+1),即 ~x+1

3)代替减法

不能用加号。x-y,可以理解成 x+(-y) 即,x+~y+1

4)代替加法

不能用减号。x+y,可以理解成   x-(-y),即x-(~y+1)

3.题目

面试题 05.01. 插入 - 力扣(LeetCode)

class Solution {
public:
    int insertBits(int N, int M, int i, int j) {
    int k;
    //先把N的i到j位清零
    for(k=i;k<=j;k++)
    {//举例:(1<<2)表示00000100,取反后得11111011,N&=(11111011)表示将N的第2位变为0(位数从0开始记)
      N&=~(1<<k);  
    }
    //位与0,结果0,位与1结果不变。

    return N|(M<<i);//位或0,结果不变。 
    }
};

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

位运算左移、右移、按位取反 的相关文章

  • win10 Remote Host 调试 ubuntu18.04 中有libXXX.so库,报/usr/lib/ld 找不到-lxxx

    按照下图操作 xff0c 找到自己的交叉编译环境中的g 43 43 和gcc工具可以解决
  • CDN和Akamai

    最近在看分布式相关的东西 xff0c 在看到HTTP Caching的时候 xff0c 提到CDN和Akamai 以前对这些东西都是一无所知啊 记录一下吧 http zh wikipedia org wiki E5 85 A7 E5 AE
  • 在Centos7环境安装GitLab

    https about gitlab com install centos 7 1 Install and configure the necessary dependencies On CentOS 7 and RedHat Oracle
  • 免费的天气api

    这是最近网上查询到关于天气的api xff0c 大部分的接口都是收费 xff0c 有部分接口虽然免费 xff0c 但查询到的信息量特别不全 但好在有几个免费接口倒是不错 xff0c 倒是可以使用 免费的天气api 高德地图 天气查询免费ap
  • Enlightenment官网介绍

    Enlightenment和EFL的官方网站 xff1a http www enlightenment org Enlightenment xff1a Enlightenment 是一个旗舰项目 它曾经是一个不起眼的 X11 窗口管理器 W
  • Enlightenment 是窗口管理器,Enlightenment 是桌面外壳,Enlightenment是创建漂亮应用程序的材料

    Enlightenment 是窗口管理器 xff0c Enlightenment 是桌面外壳 xff0c Enlightenment是创建漂亮应用程序的材料 xff0c Enlightenment xff0c 或者简单的一个 e xff0c
  • ubuntu安装nvidia显卡驱动报错:”The CC version check failed”

    参考过不少博主回答的问题 xff0c 但都存在很多问题 xff0c 或者比较麻烦 xff0c 给大家推荐一下我自己尝试解决后比较好的一个方案 xff1a 出现这个问题的原因是因为驱动可能比较新 xff0c 系统内核的gcc版本和编译器的默认
  • codeforces1169C 二分答案+思维

    1169C 1700的题 xff0c 然而比赛的时候没有做出来 题意 xff1a 给你一个n表示序列长度为n xff0c 还有一个m表示这个序列的最大值小于m 然后对这个数组进行多次操作 xff0c 一次操作为 对ai xff0c aj x
  • python用pip装第三方库numpy时报错:UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 7: ordi

    python用pip装第三方库numpy时一直报错 xff1a UnicodeDecodeError 39 ascii 39 codec can 39 t decode byte 0xc3 in position 7 ordinal not
  • debian8 jessie 更换为国内源

    编辑 etc apt sources list文件 xff1a 用 注释掉老的源 添加新的源 xff0c deb http mirrors 163 com debian jessie main non free contrib deb ht
  • 09、Flutter FFI Dart Native API

    Flutter FFI 学习笔记系列 Flutter FFI 最简示例 Flutter FFI 基础数据类型 Flutter FFI 函数 Flutter FFI 字符串 Flutter FFI 结构体 Flutter FFI 类 Flut
  • Copilot 自动编程AI工具

    OpenAI与GitHub联合构建的AI自动编程工具Copilot xff0c Copilot基于自然语言处理模型GPT 3搭建而成 xff0c Copilot预览版已经正式上线Visual Studio Code平台 OpenAI的GPT
  • SQLite的SQL语法

    SQLite库可以解析大部分标准SQL语言 但它也省去了一些特性 并且加入了一些自己的新特性 这篇文档就是试图描述那些SQLite支持 不支持的SQL语法的 查看关键字列表 如下语法表格中 xff0c 纯文本用蓝色粗体显示 非终极符号为斜体
  • 动态链接库dll(Windows/C++)

    1 概念 xff08 1 xff09 动态链接库广泛用于Windows系统及应用程序 xff0c 不能单独被执行 xff0c 在应用程序运行期间被动态调用的模块文件 区别于静态链接库 xff0c 均属于独立的代码编译模块 xff0c 但静态
  • 【Java】反射时获取父类属性并赋值

    1 反射获取父类 在反射获取类里的所有属性的时候 xff0c 会遇到无法访问父类extends里面的值 这时候需要访问父类需要调用Class的方法getSuperclass 对父类进行遍历field 同时如果不想遍历到Object或者某个类

随机推荐

  • linux软件包安装命令——apt-get

    apt get是linux中APT软件包的管理工具 采用shell命令行的方式完成软件的安装 更新 卸载等操作 1 语法 apt get xff08 选项 xff09 xff08 参数 xff09 选项 xff1a c 指定配置文件 o 直
  • 浅谈路由器的wan、lan、wlan口和vlan/trunk口

    背景 另一篇博文分析了一个实际的路由问题 xff0c 为方便问题分析 xff0c 在此列出常用概念 vlan中的trunk口 VLAN Trunk以及三层交换 可以把switch某一端口设为trunk 端口 问题 IP地址分类 xff1a
  • bzoj4864 [BeiJing 2017 Wc]神秘物质

    http www elijahqi win 2018 01 26 bzoj4864 beijing 2017 wc E7 A5 9E E7 A7 98 E7 89 A9 E8 B4 A8 20 E2 80 8E Description 21
  • mysql8设置远程连接详细教程

    这是转载StackOverFlow上的回答 xff0c 原回答点此这里 Remote Access in MySQL 8 Allow access from any host sudo nano etc mysql mysql conf d
  • 倒水问题(bfs)

    题意概述 34 fill A 34 表示倒满A杯 xff0c 34 empty A 34 表示倒空A杯 xff0c 34 pour A B 34 表示把A的水倒到B杯并且把B杯倒满或A倒空 Input 输入包含多组数据 每组数据输入 A B
  • A-化学

    题目概述 假设如上图 xff0c 这个烷烃基有6个原子和5个化学键 xff0c 6个原子分别标号1 6 xff0c 然后用一对数字 a b 表示原子a和原子b间有一个化学键 这样通过5行a b可以描述一个烷烃基 你的任务是甄别烷烃基的类别
  • B-评测系统

    题目概述 例如某次考试一共八道题 xff08 A B C D E F G H xff09 xff0c 每个人做的题都在对应的题号下有个数量标记 xff0c 负数表示该学生在该题上有过的错误提交次数但到现在还没有AC xff0c 正数表示AC
  • week4_C TT的神秘礼物

    题目描述 TT 是一位重度爱猫人士 xff0c 每日沉溺于 B 站上的猫咪频道 有一天 xff0c TT 的好友 ZJM 决定交给 TT 一个难题 xff0c 如果 TT 能够解决这个难题 xff0c ZJM 就会买一只可爱猫咪送给 TT
  • week8_C 班长竞选(Kosaraju算法 SCC缩点)

    题目描述 大学班级选班长 xff0c N 个同学均可以发表意见 若意见为 A B 则表示 A 认为 B 合适 xff0c 意见具有传递性 xff0c 即 A 认为 B 合适 xff0c B 认为 C 合适 xff0c 则 A 也认为 C 合
  • week15实验 D_瑞瑞爱上字符串/F_东东:“来不及解释了,快上车!!”

    D 瑞瑞爱上字符串 题目 瑞瑞最近迷上了字符串 xff0c 因此决定出一个字符串的题 给定两个正整数 N K xff0c 考虑所有由 N 2 个 a 和 2 个 b 组成的字符串 xff0c 要求输出其中字典序第 K 小的 例如当 N 61
  • CSP-M4补题 A_TT数鸭子

    题目 这一天 xff0c TT因为疫情在家憋得难受 xff0c 在云吸猫一小时后 xff0c TT决定去附近自家的山头游玩 TT来到一个小湖边 xff0c 看到了许多在湖边嬉戏的鸭子 xff0c TT顿生羡慕 此时他发现每一只鸭子都不 一样
  • 第二道月模csp201604-3 路径解析

    题目 在操作系统中 xff0c 数据通常以文件的形式存储在文件系统中 文件系统一般采用层次化的组织形式 xff0c 由目录 xff08 或者文件夹 xff09 和文件构成 xff0c 形成一棵树的形状 文件有内容 xff0c 用于存储数据
  • 第三道月模csp201609-3炉石传说

    题目 炉石传说 xff1a 魔兽英雄传 xff08 Hearthstone Heroes of Warcraft xff0c 简称炉石传说 xff09 是暴雪娱乐开发的一款集换式卡牌游戏 xff08 如下图所示 xff09 游戏在一个战斗棋
  • 第四道月模csp201809-3 元素选择器

    题目背景 题目描述 输入输出 Input Output Sample Input Sample Output 数据规模和约定 思路分析 根据题意 xff0c 创建element结构体 xff0c 新建element类型数组e xff0c 用
  • Debian设置合上笔记本盖子不休眠

    序言正文 序言 在使用的debian的时候 xff0c 发现在哪都找不到设置合上笔记本盖子不做任何事情的选项 xff0c 不像Ubuntu可以在电源里设置 在这里介绍编辑Login Manager 的配置文件 xff08 logind co
  • 学生认证免费领取——使用阿里云服务器的Ubuntu版本,并进行图形化

    一 前言 我们学习和工作中经常需要使用Linux系统来跑程序 我们可以使用虚拟机装一个Ubuntu镜像 当然我们为了方便也可以使用阿里云的服务器 二 获取服务器 1 到阿里云官网 没有账号的同学注册一个就OK 2 搜索框搜索 学生优惠 3
  • Python Pyside/Pyqt 禁止拉伸窗体

    可能是搜索姿势不正确 xff0c 搜了半天没搜到正确答案 随手做个笔记 值可以写死 xff0c 但是一改UI又要重新改这 xff0c 太麻烦 xff0c 索性 加载UI文件时 def init self 对ui文件进行加载 self ui
  • Win10 编译运行Fortran77程序,开发环境搭建

    有个朋友说我讲的blas中的fortran语法有个地方不正确 xff0c 非说他自己的理解是对的 怎么肯能 xff0c f77都看了十几年了 拿出证据来才行 xff0c 朋友却说自己不知道怎么编译f77程序 好吧 xff0c 那还这么自信呀
  • C++ time(0)函数

    time 0 函数返回当前格林尼治标准时间与格林尼治标准时间1970年0分0秒的时间间隔 头文件 include lt ctime gt 问题 xff1a 得到当前时间 include lt iostream gt include lt c
  • 位运算左移、右移、按位取反

    目录 一 异或习题补充 1 260 只出现一次的数字 III 力扣 xff08 LeetCode xff09 二 位运算左移 1 概念 1 xff09 二进制形态 2 xff09 执行结果 3 xff09 负数左移的执行结果 4 xff09