精华内容
下载资源
问答
  • c++位运算
    2021-06-27 15:35:01

    一. 异或运算

    按位异或运算将两个运算分量的对应位按位遵照以下规则进行计算:

     0 ^ 0 = 0, 0 ^ 1 = 1, 1 ^ 0 = 1, 1 ^ 1 = 0
    

    即相应位的值相同的,结果为 0,不相同的结果为 1。

    异或运算的意思是求两个运算分量相应位值是否相异,相异的为1,相同的为0。按位异或运算的典型用法是求一个位串信息的某几位信息的反。如欲求整型变量j的最右4位信息的反,用逻辑异或运算017^j,就能求得j最右4位的信息的反,即原来为1的位,结果是0,原来为0的位,结果是1。

    总结:异或运算有以下三个性质。

    1.任何数和 00 做异或运算,结果仍然是原来的数,即 a^ 0=a
    2.任何数和其自身做异或运算,结果是 0,即 a^ a=0
    3.异或运算满足交换律和结合律,例如下面例题:

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

    class Solution {
    public:
        int singleNumber(vector<int>& nums) {
            int res = 0;
            for(int i = 0 ; i < nums.size(); i++){
                res = nums[i] ^ res;
            }
            return res;
        }
    };
    

    二.

    更多相关内容
  • C++位运算

    千次阅读 2020-12-20 23:35:11
    位运算是指按二进制进行的运算。在系统软件中,常常需要处理二进制的问题。C语言提供了6个操作运算符。这些运算符只能用于整型操作数,即只能用于带符号或无符号的char,short,int与long类型。C语言提供的...

    位运算是指按二进制进行的运算。在系统软件中,常常需要处理二进制位的问题。C语言提供了6个位操作运算符。这些运算符只能用于整型操作数,即只能用于带符号或无符号的char,short,int与long类型。

    C语言提供的位运算符列表:

    运算符 含义 描述

    & 按位与 如果两个相应的二进制位都为1,则该位的结果值为1,否则为0

    | 按位或 两个相应的二进制位中只要有一个为1,该位的结果值为1

    ^ 按位异或 若参加运算的两个二进制位值相同则为0,否则为1

    ~ 取反 ~是一元运算符,用来对一个二进制数按位取反,即将0变1,将1变0

    << 左移 用来将一个数的各二进制位全部左移N位,右补0

    >> 右移 将一个数的各二进制位右移N位,移到右端的低位被舍弃,对于无符号数,高位补0

    1、“按位与”运算符(&) 按位与是指:参加运算的两个数据,按二进制位进行“与”运算。如果两个相应的二进制位都为1,则该位的结果值为1;否则为0。这里的1可以理解为逻辑中的true,0可以理解为逻辑中的false。按位与其实与逻辑上“与”的运算规则一致。逻辑上的“与”,要求运算数全真,结果才为真。若,A=true,B=true,则A∩B=true

    例如:3&5

    3的二进制编码是11(2)。(为了区分十进制和其他进制,本文规定,凡是非十进制的数据均在数据后面加上括号,括号中注明其进制,二进制则标记为2)内存储存数据的基本单位是字节(Byte),一个字节由8个位(bit)所组成。位是用以描述电脑数据量的最小单位。二进制系统中,每个0或1就是一个位。将11(2)补足成一个字节,则是00000011(2)。5的二进制编码是101(2),将其补足成一个字节,则是00000101(2)

    按位与运算:

    00000011(2)

    &00000101(2)

    00000001(2)

    由此可知3&5=1

    c语言代码:

    #include

    main()

    {

    int a=3;

    int b = 5;

    printf("%d",a&b);

    }

    按位与的用途:

    (1)清零

    若想对一个存储单元清零,即使其全部二进制位为0,只要找一个二进制数,其中各个位符合一下条件:

    原来的数中为1的位,新数中相应位为0。然后使二者进行&运算,即可达到清零目的。

    例:原数为43,即00101011(2),另找一个数,设它为148,即10010100(2),将两者按位与运算:

    00101011(2)

    &10010100(2)

    00000000(2)

    c语言源代码:

    #include

    main()

    {

    int a=43;

    int b = 148;

    printf("%d",a&b);

    }

    (2)取一个数中某些指定位

    若有一个整数a(2byte),想要取其中的低字节,只需要将a与8个1按位与即可。

    a 00101100 10101100

    b 00000000 11111111

    c 00000000 10101100

    (3)保留指定位:

    与一个数进行“按位与”运算,此数在该位取1.

    例如:有一数84,即01010100(2),想把其中从左边算起的第3,4,5,7,8位保留下来,运算如下:

    01010100(2)

    &00111011(2)

    00010000(2)

    即:a=84,b=59

    c=a&b=16

    c语言源代码:

    #include

    main()

    {

    int a=84;

    int b = 59;

    printf("%d",a&b);

    }

    2、“按位或”运算符(|)

    两个相应的二进制位中只要有一个为1,该位的结果值为1。借用逻辑学中或运算的话来说就是,一真为真

    例如:60(8)|17(8),将八进制60与八进制17进行按位或运算。

    00110000

    |00001111

    00111111 c语言源代码:

    #include

    main()

    {

    int a=060;

    int b = 017;

    printf("%d",a|b);

    }

    应用:按位或运算常用来对一个数据的某些位定值为1。例如:如果想使一个数a的低4位改为1,则只需要将a与17(8)进行按位或运算即可。

    3、交换两个值,不用临时变量例如:a=3,即11(2);b=4,即100(2)。

    想将a和b的值互换,可以用以下赋值语句实现:

    a=a∧b;

    b=b∧a;

    a=a∧b;

    a=011(2)

    (∧)b=100(2)

    a=111(2)(a∧b的结果,a已变成7)

    (∧)b=100(2)

    b=011(2)(b∧a的结果,b已变成3)

    (∧)a=111(2)

    a=100(2)(a∧b的结果,a已变成4)

    等效于以下两步:

    执行前两个赋值语句:“a=a∧b;”和“b=b∧a;”相当于b=b∧(a∧b)。

    再执行第三个赋值语句: a=a∧b。由于a的值等于(a∧b),b的值等于(b∧a∧b),

    因此,相当于a=a∧b∧b∧a∧b,即a的值等于a∧a∧b∧b∧b,等于b。

    很神奇吧!

    c语言源代码:

    #include

    main()

    {

    int a=3;

    int b = 4;

    a=a^b;

    b=b^a;

    a=a^b;

    printf("a=%d b=%d",a,b);

    }

    4、“取反”运算符(~)

    他是一元运算符,用于求整数的二进制反码,即分别将操作数各二进制位上的1变为0,0变为1。

    例如:~77(8)

    源代码:

    #include

    main()

    {

    int a=077;

    printf("%d",~a);

    }

    5、左移运算符(<

    左移运算符是用来将一个数的各二进制位左移若干位,移动的位数由右操作数指定(右操作数必须是非负

    值),其右边空出的位用0填补,高位左移溢出则舍弃该高位。

    例如:将a的二进制数左移2位,右边空出的位补0,左边溢出的位舍弃。若a=15,即00001111(2),左移2

    位得00111100(2)。

    源代码:

    #include

    main()

    {

    int a=15;

    printf("%d",a<<2);

    }

    左移1位相当于该数乘以2,左移2位相当于该数乘以2*2=4,15<<2=60,即乘了4。但此结论只适用于该

    数左移时被溢出舍弃的高位中不包含1的情况。

    假设以一个字节(8位)存一个整数,若a为无符号整型变量,则a=64时,左移一位时溢出的是0

    ,而左移2位时,溢出的高位中包含1。

    6、右移运算符(>>)右移运算符是用来将一个数的各二进制位右移若干位,移动的位数由右操作数指定(右操作数必须是非负

    值),移到右端的低位被舍弃,对于无符号数,高位补0。对于有符号数,某些机器将对左边空出的部分

    用符号位填补(即“算术移位”),而另一些机器则对左边空出的部分用0填补(即“逻辑移位”)。注

    意:对无符号数,右移时左边高位移入0;对于有符号的值,如果原来符号位为0(该数为正),则左边也是移

    入0。如果符号位原来为1(即负数),则左边移入0还是1,要取决于所用的计算机系统。有的系统移入0,有的

    系统移入1。移入0的称为“逻辑移位”,即简单移位;移入1的称为“算术移位”。 例: a的值是八进制数113755: a:1001011111101101

    (用二进制形式表示)

    a>>1:

    0100101111110110 (逻辑右移时)

    a>>1:

    1100101111110110 (算术右移时)

    在有些系统中,a>>1得八进制数045766,而在另一些系统上可能得到的是145766。Turbo

    C和其他一些C

    编译采用的是算术右移,即对有符号数右移时,如果符号位原来为1,左面移入高位的是1。

    源代码:

    #include

    main()

    {

    int a=0113755;

    printf("%d",a>>1);

    }

    7、位运算赋值运算符

    位运算符与赋值运算符可以组成复合赋值运算符。

    例如:

    &=, |=, >>=, <<=, ∧=

    例:

    a & = b相当于 a = a & b

    a

    << =2相当于a = a << 2

    转自:http://blog.sina.com.cn/s/blog_60e96a410100mjd2.html

    展开全文
  • c++位运算—&

    2021-10-09 07:00:55
    @[TOC](<center>Title</center>) <hr style=" border:solid; width:100px; height:1px;" color=#000000 size=1"> # 前言 <font color=#999AAA >**简述文章内容或者创作目的**<...

    目录

    一:&运算的介绍

    二:&运算的一些用法 

            1:求出除以2的余数:

            2:求出一个数的二进制中有几个“1”


    一:&运算的介绍

            &是一种位运算,如3&5的结果为1:

            

             运行原理如下:首先把5和3用二进制表示                            101

             数位不够就用0来填补                                                         011

                                                                                                 &--------------

             最后每一位都进行一次运算(都为1即为1,否则为0)         001

            解释:先看第一位 1和0因为0不成立,所以写0,第二位 0和1也是因为0不成立,所以写0,第三位1和1都成立,所以写1,最后就成了(001)2=(1)10。

    二:&运算的一些用法 

            1:求出除以2的余数:

    #include <bits/stdc++.h>
    using namespace std;
    void h(int n){
    	n=n&1;
    	if(n==1){
    		cout<<"奇数\n";
    	}
    	else{
    		cout<<"偶数\n"; 
    	}
    	return; 
    }
    int main(){
    	int n;
    	while(cin>>n){
    		h(n);
    	}
    	return 0;
    }

            用位运算来求除以二的余数会比%快一点,所以建议用位运算。

            2:求出一个数的二进制中有几个“1”

    #include <bits/stdc++.h>
    using namespace std;
    void h(int n){
    	int tot=0,t=n;
    	while(n){
    		n=n&(n-1);
    		tot++;
    	}
    	cout<<t<<"的二进制中共有"<<tot<<"个一\n";
    	return;
    }
    int main(){
    	int n;
    	while(cin>>n){
    		h(n);
    	}
    	return 0;
    }

            原理我也不是很懂,也是结合老师上课讲的编写出来的,所以没有写注释……

    展开全文
  • C与C++位运算封装代码
  • C++位运算简介

    2013-09-18 04:30:41
    C++位运算,与或非等等
  • C/C++位运算详解及相关作用。 运算符含义描述 运算符 含义描述 & 按与 如果两个相应的二进制都为1,则该的结果值为1,否则为0 I 按或 两个相应的二进制中只要有一个为1,该的结果值为1 ...


    C/C++位运算详解及相关作用。

    运算符含义描述

    运算符含义描述
    & 按位与如果两个相应的二进制位都为1,则该位的结果值为1,否则为0
    I 按位或两个相应的二进制位中只要有一个为1,该位的结果值为1
    ^ 按位异或如果参加运算的两个二进制位值相同则为0,否则为1
    ~ 取反~是一元运算符,用来对一个二进制数按位取反,即将0变1,将1变0
    << 左移用来将一个数的各二进制位全部左移N位,右补0
    >> 右移将一个数的各二进制位右移N位,移到右端的低位被舍弃,对于无符号数,高位补0

    用途

    &按位与

    (1)清零
    若想对一个存储单元清零,即使其全部二进制位为0,只要找一个二进制数,其中各个位符合一下条件:原来的数中为1的位,新数中相应位为0。然后使二者进行&运算,即可达到清零目的。
    例:原数为43,即00101011,另找一个数,设它为148,即10010100
    将两者按位与运算:
    00101011 & 10010100,得00000000
    (2)取一个数中某些指定位
    若有一个整数a(2byte),想要取其中的低字节,只需要将a与8个1按位与即可。
    a 00101100 10101100 & b 00000000 11111111,得c 00000000 10101100
    (3)保留指定位:
    与一个数进行“按位与”运算,此数在该位取1。
    例如:有一数84,即01010100,想把其中从左边算起的第3,4,5,7,8位保留下来.
    运算如下:
    01010100 & 00111011,得 00010000
    即:a=84,b=59
    c=a&b=16
    (4)判断奇偶
    只要根据最末位是0还是1即可判断整数的奇偶性。例如整数n,可以用if((n & 1) == 0)来判断,要比if(n % 2 == 0)判断奇偶性效率高。
    (5)判断一个整数是不是2的整数次方
    如果一个整数是2的整数次方,那么它的二进制标识中一定有且只有一位是1,而其他所有位均为0.
    解决方案:
    把这个整数减去1之后再和本身做与运算,这个整数中唯一的一个1就会变成0.所以只要判断是不是等于0即可。

    |按位或

    (1)按位或运算常用来对一个数据的某些位定值为1
    如果想使一个数a的低4位改为1,则只需要将a与15进行按位或运算即可。

    ^异或

    (1)使特定位翻转
    设有数01111010,想使其低4位翻转,即1变0,0变1。可以将其与00001111进行“异或”运算。
    即:
    01111010 ^ 00001111,得01110101
    运算结果的低4位正好是原数低4位的翻转。可见,要使哪几位翻转就将与其进行∧运算的该几位置为1。
    (2)与0相“异或”,保留原值
    例如:
    012 ^ 00=012
    00001010 ^ 00000000,得00001010
    因为原数中的1与0进行异或运算得1,0^0得0,故保留原数。
    (3) 交换两个值,不用临时变量
    例如:
    a=3,即11;b=4,即100。
    想将a和b的值互换,可以用以下赋值语句实现:
    a=a∧b;
    b=b∧a;
    a=a∧b;
    a=011
    (∧)b=100
    a=111(a∧b的结果,a已变成7)
    (∧)b=100
    b=011(b∧a的结果,b已变成3)
    (∧)a=111
    a=100(a∧b的结果,a已变成4)
    等效于以下两步:
    ① 执行前两个赋值语句:“a=a∧b;”和“b=b∧a;”相当于b=b∧(a∧b)。
    ② 再执行第三个赋值语句: a=a∧b。由于a的值等于(a∧b),b的值等于(b∧a∧b),因此,相当于a=a∧b∧b∧a∧b,即a的值等于a∧a∧b∧b∧b,等于b。
    (4) 快速判断两个值是否相等
    例如:判断两个整数a = 1,b = 1是否相等,则可通过异或实现。

    ~取反

    一元运算符,用于求整数的二进制反码(变换符号),即分别将操作数各二进制位上的1变为0,0变为1。
    例如:~77变77。

    <<左移运算符

    左移运算符是用来将一个数的各二进制位左移若干位,移动的位数由右操作数指定(右操作数必须是非负值),其右边空出的位用0填补,高位左移溢出则舍弃该高位。
    左移1位相当于该数乘以2,左移2位相当于该数乘以2*2=4,15<<2=60,即乘了4。但此结论只适用于该数左移时被溢出舍弃的高位中不包含1的情况。

    >>右移运算符

    右移运算符是用来将一个数的各二进制位右移若干位,移动的位数由右操作数指定(右操作数必须是非负值),移到右端的低位被舍弃,对于无符号数,高位补0。
    *注意:*对无符号数,右移时左边高位移入0;对于有符号的值,如果原来符号位为0(该数为正),则左边也是移入0。如果符号位原来为1(即负数),则左边移入0还是1,要取决于所用的计算机系统。有的系统移入0,有的系统移入1。移入0的称为“逻辑移位”,即简单移位;移入1的称为“算术移位”。
    结合:<<左移运算符与<<左移运算符相关应用
    (1)高低位互换
    给出一个16位的无符号整数。称这个二进制数的前8位为“高位”,后8位为“低位”。现在写一程序将它的高低位交换。例如,数34520用二进制表示为:
       10000110 11011000
    将它的高低位进行交换,我们得到了一个新的二进制数:
       11011000 10000110
    它即是十进制的55430。
    这个问题用位操作解决起来非常方便,设x=34520=10000110 11011000(二进制) 由于x为无符号数,右移时会执行逻辑右移即高位补0,因此x右移8位将得到00000000 10000110。而x左移8位将得到11011000 00000000。可以发现只要将x>>8与x<<8这两个数相或就可以得到1101100010000110。

    展开全文
  • c++位运算c++位运算

    2011-08-02 13:13:14
    c++位运算c++位运算c++位运算c++位运算c++位运算c++位运算c++位运算c++位运算c++位运算
  • 位运算积累
  • 细说C++(五):C++位运算详解

    千次阅读 2018-10-07 15:21:09
    C++位运算符(满足左结合律) 运算符作用于整数对象,并将位运算对象看作二进制集合 一般来说,若运算对象“小整型”,则其值会被自动提升 运算对象可以为有符号型或无符号型 (有符号型;具体如何处理...
  • 位运算c++位运算

    2013-04-10 15:36:25
    c++位运算
  • C++位运算:求 int 绝对值

    千次阅读 2020-05-29 19:46:16
    如何使用位运算对整数求绝对值呢?
  • c/c++位运算--判断对应标识是否为1

    千次阅读 2020-03-25 10:19:28
    //判断DWORD对应是否为1 //b为需要判断的数, i为对应的位数 BOOL TestDword(DWORD b, DWORD i) //判断b的第i是否为1 { ATLASSERT(i <= 31); return (b&(0x01<<i))==0?FALSE:TRUE; } ...
  • c++位运算讲解及代码

    2014-08-11 20:21:57
    位运算说穿了,就是直接对整数在内存中的二进制进行操作。比如,and运算本来是一个逻辑运算符,但整数与整数之间也可以进行and运算。举个例子,6的二进制是110,11的二进制是1011,那么6 and 11的结果就是2,它是...
  • C++位运算(二进制)

    千次阅读 2022-05-04 16:20:27
    引言:我们都知道,计算机的所有操作实际上都是在二进制下进行的,因此,在二进制条件下进行的位运算的速度实际是很快的,在编程中运用适当位运算可以降低程序的时间复杂度。 ~取反 : ~x,表示将x的各位取反,即...
  • C++位运算

    千次阅读 2020-07-31 22:43:59
    目录01、目录02、前言03、初识位运算04、位运算操作符4.1 按与 02、前言 今天恰逢Visual Studio 2015出了点毛病,迫于无奈之下只有卸载重装,这种比较费时间的事情,就写一篇博客叭。 整理了下思路,复习了下...
  • 位运算符号 移位运算: 二 常用技巧: 三 运算符号优先级: 四 位运算常用技巧 1 判断奇偶性 2 求a的b次方 3 找处未重复的数 4用O(1)时间检测整数n是否是2的幂次. 5计算在一个 32 的整数的二进制表示...
  • 来谈谈C++ 位运算 & | << >> ^ ~ %

    万次阅读 多人点赞 2014-03-07 20:43:45
    我觉得高手用的会比较多,因为位运算速度比较快。 1.& 如果两个相应的二进制都为1,则该的结果值为1;否则为0。 注:下面都用8的 unsigned char 来做例子。 &简单举例: 11&3 = 3 00001011 &
  • C/C++位操作、位运算

    千次阅读 2021-03-03 22:21:06
    通常,1字节包含8,C语言用**字节**(byte)表示储存系统字符集所需的大小,从左往右,分别给这8分别编号7~0,在一字节中,编号是7的被称为高阶,编号为0的被称为低阶。该字节能表达的最大数字:1111 ...
  • 本文带领大家理解C/C++中的位运算,为新手特地编写了补码的实现过程,本人能力有限,希望各位能在评论区对我的不足以及错误进行更正,谢谢大家! 一、位运算是什么? 众所周知,计算机内存都是以二进制的方式在内存...
  • C++中的位运算

    千次阅读 多人点赞 2018-03-24 23:42:01
      最近博主在刷Leedcode题,很多人都是采用位运算来解题的,看的我满脸雾水,所以上网收集了一下c++中关于位运算的知识,为此总结一下,有不妥的地方还望指正。   程序中的所有数在计算机内存中都是以二进制...
  • C,C#,C++中&&和||,&和|的联系和区别 两者计算结果相同(针对各自的运算对象),只是性能上有差别而已。 &&和||:逻辑运算符 &和|:按运算符 &&是且的意思,a&&b 两者都为真才为真. ||是或的意思,a||b 两者有一...
  • C++ 算法篇 位运算

    万次阅读 多人点赞 2018-11-26 15:34:01
    1. 理解与掌握 C++ 中的位运算。 2. 灵活应用位运算优化程序。 任何信息在计算机中都是采用二进制表示的,数据在计算机中是以补码形式存储的,位运算就是直接对整数在内存中的二进制进行运算。由于位运算直接对...
  • 今天写归并排序,二分时用了位运算,结果总是出bug:stack overflow 找了半天才发现原因 int mid = left + (right - left)>>1; //错!>>优先级在+后面 int mid = left + ((right-left)>>1); //...
  • C++位运算实现加减乘除

    千次阅读 2019-09-04 19:32:00
    近日复习剑指offer,看到了当时写第65题题实现了位运算的加减乘除法,特此记录 1.加法 的异或运算跟求"和"的结果一致: 异或 1^1=0 1^0=1 0^0=0 求和 1+1=0 1+0=1 0+0=0 的与运算后<<1的结果跟求...
  • C/C++ 位运算 常见作用总结

    千次阅读 2018-03-14 21:51:09
    与 &amp; 快速清零 int a=0x0001; a&amp;=0; //a : 0x0000 保留指定位 int a=0x0111; int b=0x0010; a=a&amp;b; //a : 0x0010 判断奇偶 int a=2; int b=3; //与1按与 a=a&...
  • C++ 使用位运算判断整数的奇偶性

    千次阅读 2020-08-13 10:52:49
    另外有一种方法,可以通过运算判断整数的奇偶性 如下面代码: #include <iostream> using namespace std; int main() { int a = 5; if ((a & 1) == 1) cout << "jishu" << endl; ...
  • C++:用位运算实现加减乘除

    千次阅读 2021-01-14 23:50:30
    6 * 10 = 6 * 8 + 6 * 2 也就是让被乘数乘以2的倍数,在二进制里面,一个数乘以2的倍数,就相当于左移对应的位数,这样,我们就可以运用位运算来实现乘法。所以 0110 * 1010 = 0110 * 1000 + 0110 * 0010 就相当于...
  • 逻辑运算先掌握各种运算,注意运算符的级别比较,做题是要细心。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 303,149
精华内容 121,259
关键字:

c++位运算