精华内容
下载资源
问答
  • 二进制的位运算

    2016-10-18 16:49:49
    二进制的位运算有哪些? (1).按位and运算& (2).按位or运算| (3).按位异或运算^ (4).取反运算~ (5).左移运算 (6).右移运算>>

    二进制的位运算有哪些?
    (1).按位and运算&
    (2).按位or运算|
    (3).按位异或运算^
    (4).取反运算~
    (5).左移运算<<
    (6).右移运算>>

    1.and运算&

           and运算通常用于二进制取位操作。例如:n&1的结果就是取二进制的最末位,用来判断一个整数的奇偶,二进制最末位为0表示为偶数,为1表示为奇数。

           运算方法:有0得0,否则为1.

           例如:00001001

                 &  00010101

                 ———————

                     00000001

    2.or运算|

            or运算通常用于二进制特定位赋值操作。例如:n|1的结果就是把二进制最末位强行改变成1,如果要把最末位变成0,对这个数or运算后减1即可。

           运算方法:有1得1,否则为0.

           例如:01101010

                |    00110111

                    ——————

                                01111111

    3.异或运算^:

            按位异或运算,对等长二进制模式按位或二进制数的每一位执行逻辑按位异或操作,操作结果是如果某位不同则该位为1,否则为0.异或运算的逆运算是它本身,即就是两次异或同一个数最后结果不变。

            异或运算可以用于简单的加密,比如说,我想对我喜欢的人说5201314,但又不想别人知道,于是双方约定一个密码19951204.  5201314^951204=5234598,我把5234598告诉他,他计算5234598^951204,得到5201314,于是他就明白了我的意思,我们就这样悄悄的传递了甜言蜜语,是不是很棒。

            运算方法:相同为0,不同为1.

            例如:10101001

                  ^    01011111

                     __________

                        11110110

           此外,通过异或运算也可以很方便去实现两数的交换。

    代码:a = a^b;

               b = b^a;

               a = a^b;

    4.not运算~(取反运算)

             not运算是把内存中的0和1全部取反,使用not运算要区分无符号整形数和有符号整形数。

          二进制数在内存中以补码的形式存储。

          按位取反:二进制每一位取反,0变1,1变0.

          例如:a=9;则~a=?                                          a=-9;则~a=?

           先把9转为二进制:00001001                         先把-9转为二进制:10001001

                                补码:00001001                                                补码:11110111(取反加1) 

                         按位取反:11110110                                        按位取反:00001000

           转为原码:                                                       转为原码:

                             取反:10001001                                           正数补码和原码相同,

                        末位加一:10001010 (-10)                                也为00001000(8)

                              答案为-10                                                          答案为8

    5.左移运算:

             左移运算就是把一个二进制数左移相对的的位数,右边用0补齐即可。

             例如:100<<2;

                         100转换成二进制数为:000001100100

                                      左移两位得到:000110010000(对应十进制数为400)

                         可以看出,左移就是100*pow(2,2),因为在后面添一个0实际上就是相当于*2.

    6.右移运算:

            右移运算就是把一个二进制数右移相对的的位数,左边用0或1补齐即可。

             右移运算分为逻辑移位和算术移位,逻辑移位的话,左边根据二进制数的正负,正数用全0补齐即可,负数最高为不1,其余补0即可,算术移位就是把一个二进制数右移相对的的位数,左边用0补齐即可

              例如:逻辑移位:100>>2;

                         100转换成二进制数为:000001100100

                                      右移两位得到:000000011001(对应十进制数为25)

                         可以看出,算术左移就是100/(pow(2,2)),因为在前面添几个0实际上就是相当于除2.

                         算术移位:100>>2;

                         100转换成二进制数为:100001100100

                                                  右移两位得到: 1111111111001

    展开全文
  • 二进制的位运算详解

    千次阅读 2017-12-19 18:25:30
    ① 将数转化为二进制(实际机器操作中本身就是二进制,这里意思是人工计算) ② 每一都进行如下运算: a) 1与1与运算得1 b) 1与0(0与1)与运算得0 c) 0与0与运算得0 两个数按进行或运算特点有: ...

    位运算:

    优先级8-10等 次于等于判断符和加减运算,优于逻辑与非

    一.按位与运算

    符号表示: “&”

    运算过程:

    ①   将数转化为二进制(实际机器操作中本身就是二进制,这里的意思是人工计算)

    ②   每一位都进行如下运算:

    a)      1与1与运算得1

    b)      1与0(0与1)与运算得0

    c)       0与0与运算得0

    两个数按位进行或运算特点有:

    1.     多个相同数进行与运算等于其本身

    2.     多个数进行按位与运算结果小于等于其中最小值

    3.     左结合性

    4.     优先级在位运算中最高。

     

    样例:

    1&1 = 1

    1&2 = 0

    1&2&1 = 0

     

    代码示范:

    #include <stdio.h>
    
    int main() {
        int n;
        while (scanf("%d", &n) != EOF) {
            int a;
            scanf("%d", &a);
            int temp = a;//注意这里直接把第一个数作为初值
            for (int i = 1; i < n; ++i) {
                scanf("%d", &a);
                temp = temp & a;
            }
            printf("%d\n", temp);
        }
        return 0;
    }


     特殊应用:1&n   对于n为偶数结果是0,n为奇数结果是1,可用于判断奇偶。


    二.按位或运算

    符号表示:  “|”

    运算过程:

    ③   将数转化为二进制(实际机器操作中本身就是二进制,这里的意思是人工计算)

    ④   每一位都进行如下运算:

    a)      1与1或运算得1

    b)      1与0(0与1)或运算得1

    c)       0与0或运算得0

     

    两个数按位进行或运算特点有:

    5.     多个相同数进行或运算等于其本身

    6.     多个数进行按位或运算结果大于等于其中最大值

    7.     左结合性

    8.     优先级低于按位异或和按位与。

     

    样例:

    1|1 = 0

    1|2 = 3

    2|2 = 2

    1|1|1 = 1

    1|2|1 = 3

    代码示范:

     

    #include <stdio.h>
    
    int main() {
        int n;
        while (scanf("%d", &n) != EOF) {
            int temp = 0;
            int a;
            for (int i = 0; i < n; ++i) {
                scanf("%d", &a);
                temp = temp | a;
            }
            printf("%d\n", temp);
        }
        return 0;
    }
    
     

    三.非运算

    表示方法: “~” (键盘左上角)

    运算法则为:

    a)     1按位非为0

    b)    0按位非为1

    大小不一定,优于按位或,次于按位与

    样例(二进制):

    ~1 = 0

    ~0=1

    ~10010=01101

    样例(64位int型):

    ~1 = -2

    ~2 = -3

    ~-1 = 0

    ~0 = -1

    注: int中第一位为符号位,以补码形式保存,0比较特殊它的补码的二进制为1000,0000,0000,0000所以会产生这种结果。

     

    代码示范:

    #include <stdio.h>
    
    int main() {
        int n;
        while (scanf("%d", &n) != EOF) {
            printf("%d\n", ~n);
        }
        return 0;
    }
    
     
     

    四.按位异或

    符号表示: “^”

    运算法则:

    ①   每位转换为二进制

    ②   每一位都进行如下运算:

    a)      0 ^ 0 = 0

    b)      0 ^ 1 = 1

    c)       1 ^ 0 = 1

    d)      1 ^ 1 = 0

    特点

    1.     对偶数个相同数字进行按位异或运算得到0

    2.     对奇数个相同数字进行按位异或运算得到1

    3.     对两个不同数字进行运算相当于加号

    4.     对多个不同数字结果无规律

    5.     左结合性

     

    样例:

    1 ^ 2 = 3

    1 ^ 1 = 0

    1 ^ 1 ^ 1 = 1

    2 ^ 2 ^ 2 = 2

    1 ^ 2 ^ 3 = 0

     

    示例代码:

    #include <stdio.h>
    
    int main() {
        int n;
        while (scanf("%d", &n) != EOF) {
            int a;
            scanf("%d", &a);
            int temp = a;
            for (int i = 1; i < n; ++i) {
                scanf("%d", &a);
                temp = temp ^ a;
            }
            printf("%d\n", temp);
        }
        return 0;
    }


     

    展开全文
  • 在python2.6以上的版本中自带了将十进制转化为二进制的函数bin()。看一下bin.__doc__怎么说的。>>>print bin.__doc__bin(number) -> stringreturn the binary represiontation of an integer or long ...

    在python2.6以上的版本中自带了将十进制转化为二进制的函数bin()。

    看一下bin.__doc__怎么说的。

    >>>print bin.__doc__

    bin(number) -> string

    return the binary represiontation of an integer or long integer

    这就是一个将十进制转换为二进制的函数,输出是一个字符串。那么输出看看。

    >>>a = 50

    >>>bin(a)

    '0b110010'

    的确输出了,但是多了前面两位'0b'。那么在输出的时候用bin(a)[2:]就可以避免了。

    再来说说怎么将二进制转换为十进制。

    先看看这个函数int(),使用方法是int(x, base)其中base是可选项。这个函数的__doc__大概讲的是在可以的情况下,将一个字符串或者数字转化为一个整型数字。浮点数将去掉小数位;对于字符串,需要用到base参数。

    对于浮点数的这个用法一般人都会比较清楚。对于字符串的这个,初步了解到了可以这么用。

    >>>a='1010'

    >>>int(a,2)

    10

    可以看出把二进制表示的一个字符串变成了十进制。同理,对于十六进制也可以这么干。

    >>>a='1a'

    >>>int(a,16)

    26

    这个就是进制间的转换问题。怎么把十进制转换成十六进制,在不用自己编函数的情况下我还不知道有什么方法。有朋友知道可以分享下。

    关于位运算,python提供了以下方法,:&(按位与),|(按位或),^(按位异或),~(按位取反),>>(右移运算),<

    展开全文
  • 位运算是最高效而且占用内存最少算法操作,但也是最难看懂操作。然而,关于位运算的用法,笔者查了许多资料,似乎都没有找到详细而系统讲解资料。笔者对位运算操作相当感兴趣,因此斗胆尝试对位运算来一个...

    位运算是最高效而且占用内存最少的算法操作,但也是最难看懂的操作。然而,关于位运算的用法,笔者查了许多资料,似乎都没有找到详细而系统的讲解资料。笔者对位运算的操作相当感兴趣,因此斗胆尝试对位运算来一个的总结。

    本文先从基本概念出发,然后从基本概念推导出基础应用,然后再到算法题实战。层层推进,逐步迭代。

    本人水平有限,如有勘误,敬请指正。

    说明:本文会以Python的交互环境来做代码演示。关于本文的约定:非代码块中的二进制数以下标x来表示进制数,如十进制数15,用二进制表示为

    ,而用十六进制则表示为

    所有代码块中的二进制数字都以0b开头,比如十进制数15,用二进制表示为0b1111;

    有时候需要更直观地表示,会使用竖式表示,如两个二进制数的and操作表示为:

    所有代码块中的十六进制数字都以0x开头,比如十进制数255,用十六进制表示为0xff;

    bin()函数,是Python中把十进制转换为二进制的转换函数;

    所有的位运算操作的命名均用英文命名,以增加辨识度。

    概念篇

    and 操作,操作符“&”

    定义:称为按位与运算符。它对整型参数的每一个二进制位进行布尔与操作,即两个对应的二进制位同时为1时,才等于1。

    or 操作,操作符“|”

    定义:称为按位或运算符。它对整型参数的每一个二进制位进行布尔或操作,即两个对应的二进制位,任意一个为1时,就等于1。

    xor操作,操作符“^”

    定义:称为按位异或运算符。它对整型参数的每一个二进制位进行布尔异或操作,即两个对应的二进制位,有且仅有一个为1时,才等于1。

    not操作,操作符“~”

    定义:称为按位非运算符。它是一个单运算符,对运算数的所有二进制位进行取反操作。

    shl操作,操作符“<

    定义:称为按位左移运算符。它把第一个运算数的所有二进制位向左移动第二个运算数指定的位数,而新的二进制位补0。将一个数向左移动N个二进制位相当于将该数乘以2的N次方,比如:

    shr操作,操作符“>>”

    定义:称为按位右移运算符。它把第一个运算数的所有二进制位向右移动第二个运算数指定的位数。为了保持运算结果的符号不变,左边二进制位补 0 或 1 取决于原参数的符号位。如果第一个运算数是正的,运算结果最高位补 0;如果第一个运算数是负的,运算结果最高位补 1。将一个数向右移动N个二进制位相当于将该数除以2的N次方,比如:

    (总是向负无穷方向取整)。

    原理篇

    进制转换

    进制之间的转换其实是个数学问题,在实际应用中,我们基本上无需操心。因此这里想说的不是计算问题,而是逻辑问题。二进制与十六进制有着天然的联系——每四个二进制位可以代表一个十六进制位:

    由上图可见,如果说二进制转十进制还要稍稍心算一下的话,那二进制转十六制可以马上得出。只要记住了一个十六进制位与四个二进制位的对应关系就好了。同理,八进制位与二进制的关系是,每三个二进制位对应一个八进制位,但实践中,八进制并不常见,因此点到即止。

    那么,为什么二进制与十六进制在实践中更常见呢?这是与内存的储存单位有关。

    字节与二进制数的关系

    对于计算机而言,最小的储存单位是一个字节,英文为byte。byte既是一个单位,也是一种数据类型(关于数据类型的解释,可查阅C/C++、JAVA等静态类语言的相关资料,本文不作介绍)。对于一个byte的数据,用了八个二进制位去储存数据,因此能正好用两个十六进制位来省略表示(比十进制还少写一位)。这就是为什么在实际操作中,二进制与十六进制更常见的原因。

    二进制运算符的操作范围

    笔者查阅了许多二进制运算的相关资料,似乎都忽略了对这一点的介绍。二进制运算符的作用范围与参与运算的变量的数据类型有关,比如以JAVA为例:对于byte类型变量,由于byte以8-bit(8个二进制位)表示,因此相应的位运算符的作用范围就是8-bit;

    对于int类型变量,由于int以32-bit表示,因此位运算符的作用范围就是32-bit;

    假如两个大小不一的数据类型进行操作,那位运算的作用范围会以较大的数据类型作为基准范围。

    二进制数的符号

    有了数据类型的范围限定,因此才有了高位、低位、符号位的概念。高位,指在数据类型限定范围内靠左的二进制位;

    低位,指在数据类型限定范围内靠右的二进制位;

    符号位,指在数据类型限定范围内最左边的一个二进制位,符号位为0表示正数,1表示负数。(除了C语言存在无符号的值类型外,绝大部分语言的值类型都默认为有符号的数值类型)

    因此,假如一个byte范围内的整数,提升为一个int范围内的整数,由于二进制位数的范围大了,必然需要进行补位,因此:当原byte整数为正数时,提升为int类型时,补位全部以0补位;

    当原byte整数为负数时,提升为int类型时,补位全部以1补位;

    为什么要这样做?因为这样才能保证数值在范围提升后,原值的十进制数不变。以下来看看JAVA的验证代码:

    // byte类型的值范围是[-128,127]byte a = (byte) -55; //由于值在byte范围内,因此强制转换缩小变量内存范围不会改变原值byte b = (byte) 100;

    System.out.println(Integer.toBinaryString(a)); //输出(二进制数):11111111111111111111111111001001System.out.println(Integer.valueOf(a)); //输出:-55(重新提升范围,值不变)System.out.println(Integer.toBinaryString(b)); //输出(二进制数):1100100(高位的0会被省略显示)System.out.println(Integer.valueOf(b)); //输出:100

    二进制下的负数表示法

    对于一个十进制的负数,我们经常把它看作是一个数加一个负号;然而对于二进制负数来讲,却不是一堆二进制位数加一个符号位。

    二进制的正数与负数之间的关系更像是“进位”的关系。以下我们以一个byte值来举例:

    如上所述,byte的数值范围是[-128,127]。

    为了让表示更清楚,笔者特意把符号位隔开。留意从0到-1,由于非符号位全部为0,已经没有东西可减,但假如我们假设从更高的位借来了一个1,这样就能让

    了;有了-1,那

    就可以继续成立了……直到把除符号位之外的位全部减完,这时十进制数就相当于-128。因此,八位二进制数可以表达的数为

    个,即[-128,127]。

    二进制数的性质

    由以上的二进制数变化规律,我们可以发现二进制数有以下性质:~x = -x - 1:从以上0与-1的按位关系可以看到,两者的二进制位正好取反;此规律能推广到1与-2,2与-3……等等。因此,该性质是not操作中最常使用的性质。

    (~x)&x = 0:任意数与它的取反数的and操作结果为0。

    (~x)|x = -1:任意数与它的取反数的or操作结果为-1。

    (~x)^x = -1:任意数与它的取反数的xor操作结果为-1。

    x|0 = x:任意数x与0的or操作结果为x自己。

    x^0 = x:任意数x与0的xor操作结果为x自己。

    x^y^y = x:任意数x与任意数y进行两次xor操作结果为x自己。

    与四则运算一样,位运算也有它自己的定律。因此,我们有必要先熟悉并证明一下这些定律。

    定律篇

    and操作

    交换律,a&b = b&a

    证明:略(因为显然易见)

    结合律,(a&b)&c = a&(b&c)

    证明:只要证明一个二进制位,便能推广到N个二进制位。

    (1&0)&0 = 1&(0&0) = 0;

    1&1&0 = 1&(1&0) = 0。

    or操作

    交换律,a|b = b|a

    证明:略

    结合律,(a|b)|c = a|(b|c)

    证明:只要证明一个二进制位,便能推广到N个二进制位。

    (1|0)|0 = 1|(0|0) = 1;

    1|1|0 = 1|(1|0) = 1。

    xor操作

    交换律,a^b = b^a

    证明:略

    结合律,(a^b)^c = a^(b^c)

    证明:

    not操作

    结合律,a = ~(~a)

    证明:略

    shl操作

    shr操作

    继续深入传送门:黄伟亮:二进制与位运算实用操作汇总(应用篇)​zhuanlan.zhihu.com

    参考资料:

    展开全文
  • 二进制位运算

    2019-06-14 11:05:56
    十进制 123表示1*(10^2) + 2*(10^1) + 3*(10^0),(10^2表示10二次方) 二进制 正整数二进制表示 ...二进制使用最高表示符号,用1表示负数,用0表示正数。 整数有四种类型,byte/short/int/long,分...
  • 读余数从下读到上,即是二进制的整数部分数字。 小数部分,则用其乘 2,取其整数部分的结果,再用计算后的小数部分依此重复计算,算到小数部分全为 0 为止,之后读所有计算后整数部分的数字,从上读到下。 例:()...
  • 程序中的所有数在计算机内存中都是以二进制的形式储存的。位运算说穿了,就是直接对整数在内存中的二进制位进行操作。比如,and运算本来是一个逻辑运算符,但整数与整数之间也可以进行and运算。举个例子,6的二进制...
  • ): 可以看作二进制的 乘法运算 1 &amp; 0 = 0 1 &amp; 1 = 1 0 &amp; 0 = 0 0 &amp; 1 = 0 eg: 5 &amp; 6 = 4 ===》 5的2进制: 0000 0101 ===》 6的2进制: 0000 0110 &amp;运算=...
  • JAVA二进制.位运算.移位运算

    千次阅读 2016-07-28 09:54:34
    二进制位运算、位移运算 思考题 1、请看下面代码段,回答a,b,c,d,e结果是多少? public static void main(String []args){ int a=1>>2; int b=-1>>2; int c=1 int d=-1 int e=3>>>2; //a,b,c,d,e结果是...
  • 计算机中的二进制位运算

    千次阅读 2016-09-02 15:42:24
    参考文档 ... 1、首先谈谈是如何定义原码、反码、补码 原码:原码:一个正数,按照...一个负数按照绝对值大小转换成的二进制数,然后最高补1,称为原码。  比如 00000000 00000000 00000000 00000101 是 5 原码;1
  • 二进制比特位运算

    2018-06-01 22:11:00
    1. 基本运算 截断保留后 k ,比如 83 == 0x0101 0011 保留后 5 ,即为 0x0001 0011 == 19 x & (pow(2, k)-1) x & 0x1f 截断保留前 k ,则为: 对于 8 数据,保留前 5 :x & 0xf8 或者:先...
  • 标题就告诉我们该来还是会来,学了十几年十进制现在告诉我要学二进制,但是这个东西很重要很重要,所以还是要重点记 ...二进制数据是采用位置计数法,其权是以2为底幂。(所有十进制...
  • 二进制位运算、位移运算 思考题 1、请看下面代码段,回答a,b,c,d,e结果是多少? public static void main(String []args){ int a=1&gt;&gt;2; int b=-1&gt;&gt;2; int c=1&lt;...
  • 二进制位运算,移位运算

    千次阅读 2015-06-08 08:51:00
     二进制有着原码,反码,补码之分,在计算机中都是用补码进行运算,这样符合计算机特性。 a, 首先说说正数,正数原码,反码,补码都一样 ,只要写出原码,一切都OK,运算当然是用反码啦,在这也就是原码。 b,...
  • python 十进制与二进制以及位运算

    千次阅读 2014-07-10 23:17:01
    From: ...  在python2.6以上的版本中自带了将十进制转化为二进制的函数bin()。  看一下bin.__doc__怎么说的。 >>>print bin.__doc__ bin(number) -> string return the bina
  • 先写了一个生成连续正整数函数,调用JavaScript自带toString(2)就可以实现十进制转换为二进制。注意是,调用toSrtring()会将number类型隐式转换为string类型。 function to2(start, end) { return Array.from...
  • 1、请看下面代码段,回答a,b,c,d,e结果是多少? public static void main(String []args){ int a=1>>2; int b=-1>>2; int c=1 int d=-1 int e=3>>>2; //a,b,c,d,e结果是多少 ...
  • 计算机里的数字表示方式和存储格式就是二进制的,所以用二进制,速度很快 2.十进制转二进制 参考:...
  • 进制位运算

    2019-02-25 11:33:17
    不同数据类型的十进制转换为二进制的位数不同 一个字节(byte)是8;int类型是4个字节,32; shor类型是2个字节,16;long类型是8个字节,64;float类型是4个字节,32;double类型是8个字节,64; int....
  • 几个概念 原码: 一个整数绝对值按照二进制转化而来的二进制数 反码: 对原码每一位取反得来的二进制数 ...反码加1得到的二进制数 ...负数在计算机中以它正数补码形式存在。...位运算 & 按位
  • 二进制位运算

    千次阅读 2012-10-08 09:53:06
    一、计算机中数据  1.计算机中数据表示方法:  1.计算机是一种电子设备,由于复杂元器件组成合而成,一个电子元器件有带电和...001表示1,010表示2,011表示3,依次类推,111表示7,一个元器件可以表示一
  • 二进制位运算异或

    千次阅读 2014-07-23 10:37:35
    1、给出一个问题:给你一个整形数组,这个数组中除了一个数字只出现一次外,其他数字都只出现两次,求出那个只出现一次数字? 要求:时间复杂度为O(n) , 空间复杂度为O(1)。 这个题目难点在于空间复杂度...
  • 原码:就是十进制的数字转换为二进制在计算机中的表示,如正2,二进制表示为000 0010,(这里取8显示),-2的2进制表示为1000 0010。前面的一表示符号,其中,正数为0,负数为1 反码:正数的反码和原码相同,...
  • 子集枚举的二进制(位运算)方法

    千次阅读 2018-05-08 18:25:51
    这里我们知道每一个数字都可以由唯一的二进制串表示,我们对应于上面情况,让1代表取物品情况,0表示不取物品情况。 这样一来就有了用二进制枚举子集方法。 这里采用了位运算主要是表达简单,且速度快 ...
  • 这一篇将会了解一下计算机底层,二进制. ...十进制的每一只能为 0,1,2...9, 二进制的每一 只能是0 或1, 计算机底层计算使用的是二进制(没有学过二进制,数学比较差可能理解比较难) 也就是说,我...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 18,576
精华内容 7,430
关键字:

二进制的位运算