精华内容
下载资源
问答
  • 满意答案sqq2125272013.04.11采纳率:46%等级:12已帮助:10556人编辑本段简介 20世纪被称作第三次科技革命的重要标志之一的计算机的发明与应用,其运算模式正是二进制,同时证明了莱布尼兹的原理是正确的。...

    满意答案

    00e27ab806e4881f8254fe7ae8741834.png

    sqq212527

    2013.04.11

    00e27ab806e4881f8254fe7ae8741834.png

    采纳率:46%    等级:12

    已帮助:10556人

    编辑本段简介   20世纪被称作第三次科技革命的重要标志之一的计算机的发明与应用,其运算模式正是二进制,同时证明了莱布尼兹的原理是正确的。 编辑本段进制数   二进制数据的表示法   二进制数据也是采用位置计数法,其位权是以2为底的幂。例如二进制数据110.11,其权的大小顺序为2^2、2^1、2^0、2^-1、2^-2。对于有n位整数,m位小数的二进制数据用加权系数展开式表示,可写为:   (a(n-1)a(n-2)…a(-m))2=a(n-1)×2^(n-1)+a(n-2)×2^(n-2)+……+a(1)×2^1+a(0)×2^0+a(-1)×2^(-1)+a(-2)×2^(-2)+……+a(-m)×2^(-m)   二进制数据一般可写为:(a(n-1)a(n-2)…a(1)a(0).a(-1)a(-2)…a(-m))2。   注意:   1.式中aj表示第j位的系数,它为0和1中的某一个数。   2.a(n-1)中的(n-1)为下标,输入法无法打出所以用括号括住,避免混淆。   3.2^2表示2的平方,以此类推。   【例1102】将二进制数据111.01写成加权系数的形式。   解:(111.01)2=(1×2^2)+(1×2^1)+(1×2^0)+(0×2^-1)+(1×2^-2)   二进制和十六进制,八进制一样,都以二的幂来进位的。 编辑本段二进制运算   二进制数据的算术运算的基本规律和十进制数的运算十分相似。最常用的是加法运算和乘法运算。       二进制数据1. 二进制加法   有四种情况: 0+0=0   0+1=1   1+0=1   1+1=10 进位为1   【例1103】求 (1101)2+(1011)2 的和   解:   ??1 1 0 1   + ?1 0 1 1   -------------------   ?1 1 0 0 0 2. 二进制乘法   有四种情况: 0×0=0   1×0=0   0×1=0   1×1=1   【例1104】求 (1110)2 乘(101)2 之积   解:   ???1 1 1 0   × ?? 1 0 1   -----------------------   ??? 1 1 1 0   ?? 0 0 0 0   ?1 1 1 0   -------------------------   1 0 0 0 1 1 0   (这些计算就跟十进制的加或者乘法相同,只是进位的数不一样而已,十进制的是到十才进位这里是到2就进了)   3.二进制减法   0-0=0,1-0=1,1-1=0,10-1=1。   4.二进制除法   0÷1=0,1÷1=1。[1][2]   5.二进制拈加法   拈加法二进制加减乘除外的一种特殊算法。   拈加法运算与进行加法类似,但不需要做进位。此算法在博弈论(Game Theory)中被广泛利用。 编辑本段进制转换   十进制数转换为二进制数、八进制数、十六进制数的方法:   二进制数、八进制数、十六进制数转换为十进制数的方法:按权展开求和法 1.二进制与十进制间的相互转换:   (1)二进制转十进制   方法:“按权展开求和”   例: (1011.01)2 =(1×2^3+0×2^2+1×2^1+1×2^0+0×2^(-1)+1×2^(-2) )10   =(8+0+2+1+0+0.25)10   =(11.25)10   规律:个位上的数字的次数是0,十位上的数字的次数是1,......,依奖递增,而十   分位的数字的次数是-1,百分位上数字的次数是-2,......,依次递减。   注意:不是任何一个十进制小数都能转换成有限位的二进制数。   (2)十进制转二进制   · 十进制整数转二进制数:“除以2取余,逆序排列”(除二取余法)   例: (89)10 =(1011001)2   2 89 ……1   2 44 ……0   2 22 ……0   2 11 ……1   2 5 ……1   2 2 ……0   1   · 十进制小数转二进制数:“乘以2取整,顺序排列”(乘2取整法)   例: (0.625)10= (0.101)2   0.625X2=1.25 ……1   0.25 X2=0.50 ……0   0.50 X2=1.00 ……1 2.八进制与二进制的转换:   二进制数转换成八进制数:从小数点开始,整数部分向左、小数部分向右,每3位为一组用一位八进制数的数字表示,不足3位的要用“0”补足3位,就得到一个八进制数。   八进制数转换成二进制数:把每一个八进制数转换成3位的二进制数,就得到一个二进制数。   八进制数字与二进制数字对应关系如下:   000 -> 0 100 -> 4   001 -> 1 101 -> 5   010 -> 2 110 -> 6   011 -> 3 111 -> 7   例:将八进制的37.416转换成二进制数:   3 7 . 4 1 6   011 111 .100 001 110   即:(37.416)8 =(11111.10000111)2   例:将二进制的10110.0011 转换成八进制:   0 1 0 1 1 0 . 0 0 1 1 0 0   2 6 . 1 4   即:(10110.011)2 = (26.14)8 3.十六进制与二进制的转换:   二进制数转换成十六进制数:从小数点开始,整数部分向左、小数部分向右,每4位为一组用一位十六进制数的数字表示,不足4位的要用“0”补足4位,就得到一个十六进制数。   十六进制数转换成二进制数:把每一个十六进制数转换成4位的二进制数,就得到一个二进制数。   十六进制数字与二进制数字的对应关系如下:   0000 -> 0 0100 -> 4 1000 -> 8 1100 -> C   0001 -> 1 0101 -> 5 1001 -> 9 1101 -> D   0010 -> 2 0110 -> 6 1010 -> A 1110 -> E   0011 -> 3 0111 -> 7 1011 -> B 1111 -> F   例:将十六进制数5DF.9 转换成二进制:   5 D F . 9   0101 1101 1111 .1001   即:(5DF.9)16 =(10111011111.1001)2   例:将二进制数1100001.111 转换成十六进制:   0110 0001 . 1110   6 1 . E   即:(1100001.111)2 =(61.E)16 编辑本段二进制的特点优点   数字装置简单可靠,所用元件少;   只有两个数码0和1,因此它的每一位数都可用任何具有两个不同稳定状态的元件来表示;   基本运算规则简单,运算操作方便。 缺点   用二进制表示一个数时,位数多。因此实际使用中多采用送入数字系统前用十进制,送入机器后再转换成二进制数,让数字系统进行运算,运算结束后再将二进制转换为十进制供人们阅读。   二进制和十六进制的互相转换比较重要。不过这二者的转换却不用计算,每个C,C++程序员都能做到看见二进制数,直接就能转换为十六进制数,反之亦然。   我们也一样,只要学完这一小节,就能做到。   首先我们来看一个二进制数:1111,它是多少呢?   你可能还要这样计算:1 * 2^0 + 1 * 2^1 + 1 * 2^2 + 1 * 2^3 = 1 * 1 + 1 * 2 + 1 * 4 + 1 * 8 = 15。   然而,由于1111才4位,所以我们必须直接记住它每一位的权值,并且是从高位往低位记,:8、4、2、1。即,最高位的权值为2^3 = 8,然后依次是 2^2 = 4,2^1=2, 2^0 = 1。   记住8421,对于任意一个4位的二进制数,我们都可以很快算出它对应的10进制值。   下面列出四位二进制数 xxxx 所有可能的值(中间略过部分)   仅4位的2进制数 快速计算方法 十进制值 十六进值   1111 = 8 + 4 + 2 + 1 = 15 F   1110 = 8 + 4 + 2 + 0 = 14 E   1101 = 8 + 4 + 0 + 1 = 13 D   1100 = 8 + 4 + 0 + 0 = 12 C   1011 = 8 + 0 + 2+ 1 = 11 B   1010 = 8 + 0 + 2 + 0 = 10 A   1001 = 8 + 0 + 0 + 1 = 9 9   ....   0001 = 0 + 0 + 0 + 1 = 1 1   0000 = 0 + 0 + 0 + 0 = 0 0   二进制数要转换为十六进制,就是以4位一段,分别转换为十六进制。   如(上行为二制数,下面为对应的十六进制):   1111 1101 , 1010 0101 , 1001 1011   F D , A 5 , 9 B   反过来,当我们看到 FD时,如何迅速将它转换为二进制数呢?   先转换F:   看到F,我们需知道它是15(可能你还不熟悉A~F这五个数),然后15如何用8421凑呢?应该是8 + 4 + 2 + 1,所以四位全为1 :1111。   接着转换 D:   看到D,知道它是13,13如何用8421凑呢?应该是:8 + 4 + 1,即:1101。   所以,FD转换为二进制数,为: 1111 1101   由于十六进制转换成二进制相当直接,所以,我们需要将一个十进制数转换成2进制数时,也可以先转换成16进制,然后再转换成2进制。   比如,十进制数 1234转换成二制数,如果要一直除以2,直接得到2进制数,需要计算较多次数。所以我们可以先除以16,得到16进制数:   被除数 计算过程 商 余数   1234 1234/16 77 2   77 77/16 4 13 (D)   4 4/16 0 4   结果16进制为: 0x4D2   然后我们可直接写出0x4D2的二进制形式: 0100 1101 0010。   其中对映关系为:   0100 -- 4   1101 -- D   0010 -- 2   同样,如果一个二进制数很长,我们需要将它转换成10进制数时,除了前面学过的方法是,我们还可以先将这个二进制转换成16进制,然后再转换为10进制。   下面举例一个int类型的二进制数:   01101101 11100101 10101111 00011011   我们按四位一组转换为16进制: 6D E5 AF 1B 编辑本段莱布尼茨与二进制   在    用ftp工具以二进制方式上传德国图灵根著名的郭塔王宫图书馆(Schlossbiliothke zu Gotha)保存着一份弥足珍贵的手稿,其标题为:“1与0,一切数字的神奇渊源。这是造物的秘密美妙的典范,因为,一切无非都来自上帝。”这是德国天才大师莱布尼茨(Gottfried Wilhelm Leibniz,1646 - 1716)的手迹。但是,关于这个神奇美妙的数字系统,莱布尼茨只有几页异常精炼的描述。   莱布尼茨不仅发明了二进制,而且赋予了它宗教的内涵。他在写给当时在中国传教的法国耶稣士会牧师布维(Joachim Bouvet,1662 - 1732)的信中说:“第一天的伊始是1,也就是上帝。第二天的伊始是2,……到了第七天,一切都有了。所以,这最后的一天也是最完美的。因为,此时世间的一切都已经被创造出来了。因此它被写作‘7’,也就是‘111’(二进制中的111等于十进制的7),而且不包含0。只有当我们仅仅用0和1来表达这个数字时,才能理解,为什么第七天才最完美,为什么7是神圣的数字。特别值得注意的是它(第七天)的特征(写作二进制的111)与三位一体的关联。”   布维是一位汉学大师,他对中国的介绍是17、18世纪欧洲学界中国热最重要的原因之一。布维是莱布尼茨的好朋友,一直与他保持着频繁的书信往来。莱布尼茨曾将很多布维的文章翻译成德文,发表刊行。恰恰是布维向莱布尼茨介绍了《周易》和八卦的系统,并说明了《周易》在中国文化中的权威地位。   八卦是由八个符号组构成的占卜系统,而这些符号分为连续的与间断的横线两种。这两个后来被称为“阴”、“阳”的符号,在莱布尼茨眼中,就是他的二进制的中国翻版。他感到这个来自古老中国文化的符号系统与他的二进制之间的关系实在太明显了,因此断言:二进制乃是具有世界普遍性的、最完美的逻辑语言。   另一个可能引起莱布尼茨对八卦的兴趣的人是坦泽尔(Wilhelm Ernst Tentzel),他当时是图灵根大公爵硬币珍藏室的领导,也是莱布尼茨的好友之一。在他主管的这个硬币珍藏中有一枚印有八卦符号的硬币。   与中国易经的联系   1679年3月15日戈特弗里德·威廉·莱布尼茨发明了一种计算法,用两位数代替原来的十位数,即1 和 0.1701年他写信给在北京的神父 Grimaldi(中文名字闵明我)和 Bouvet(中文名字白晋)告知自己的新发明,希望能引起他心目中的“算术爱好者”康熙皇帝的兴趣。   白晋很惊讶,因为他发现这种“二进制的算术”与中国古代的一种建立在两个符号基础上的符号系统是非常近似的,这两个符号分别由一条直线和两条短线组成,即—— 和 — —。这是中国最著名大概也是最古老的书《易经》的基本组成部分,据今人推测,该书大约产生于公元前第一个千年的初期,开始主要是一部占卜用书,里边的两个符号可能分别代表“是”和“不”。   莱布尼茨对这个相似也很吃惊,和他的笔友白晋一样,他也深信《易经》在数学上的意义。他相信古代的中国人已经掌握了二进制并在科学方面远远超过当代的中国人。      现在我们可以肯定地说,这种解释与《易经》没有联系。《易经》不是数学书,而是一本“预言”,并在漫长的历史中逐渐演变为一本“智慧之书”。书里的短线意味着阴阳相对,也即天与地、光明与黑暗、造物主和大自然。六爻以不同的组合出现,人们可以借此对自然界和人类生活的变换做出各种不同的解释。比利时神父 P.Couplet(中文名字柏应理)的 Confucius.Sinarum Philosophus (《孔子,中国人的思想家,…》)第一次在欧洲发表了易经的六十四幅六爻八卦图。   这一次将数学与古代中国《易经》相联的尝试是不符合实际的。莱布尼茨的二进制数学指向的不是古代中国,而是未来。莱布尼茨在1679年3月15日记录下他的二进制体系的同时,还设计了一台可以完成数码计算的机器。我们今天的现代科技将此设想变为现实,这在莱布尼茨的时代是超乎人的想象能力的。 编辑本段计算机内部采用二进制的原因   (1)技术实现简单,计算机是由逻辑电路组成,逻辑电路通常只有两个状态,开关的接通与断开,这两种状态正好可以用“1”和“0”表示。   (2)简化运算规则:两个二进制数和、积运算组合各有三种,运算规则简单,有利于简化计算机内部结构,提高运算速度。   (3)适合逻辑运算:逻辑代数是逻辑运算的理论依据,二进制只有两个数码,正好与逻辑代数中的“真”和“假”相吻合。   (4)易于进行转换,二进制与十进制数易于互相转换。   (5)用二进制表示数据具有抗干扰能力强,可靠性高等优点。因为每位数据只有高低两个状态,当受到一定程度的干扰时,仍能可靠地分辨出它是高还是低。 编辑本段处理数据库二进制数据   我们在使用数据库时,有时会用到图像或其它一些二进制数据,这个时候你们就必须使用    二进制循环编码盘getchunk这个方法来从表中获得二进制大对象,我们也可以使用AppendChunk来把数据插入到表中.   我们平时来取数据是这样用的!   Getdata=rs("fieldname")   而取二进制就得这样   size=rs("fieldname").acturalsize   getdata=rs("fieldname").getchunk(size)   我们从上面看到,我们取二进制数据必须先得到它的大小,然后再搞定它,这个好像是ASP中处理二进制数据的常用方法,我们在获取从客户端传来的所有数据时,也是用的这种方法,嘿嘿大家可要记住O.   下面我们也来看看是怎样将二进制数据加入数据库   rs("fieldname").appendchunk binarydata   一步搞定!   另外,使用getchunk和appendchunk将数据一步一步的取出来!   下面演示一个取数据的例子!   Addsize=2   totalsize=rs("fieldname").acturalsize   offsize=0   Do Where offsize Binarydata=rs("fieldname").getchunk(offsize)   data=data&Binarydata   offsize=offsize+addsize   Loop   当这个程序运行完毕时,data就是我们取出的数据.

    06分享举报

    展开全文
  • 因为最近在学习的过程中...今天就来系统上地学习一下二进制运算的操作。 借鉴和简单转载: http://blog.sina.com.cn/s/blog_87b866180101lb55.html https://blog.csdn.net/qq_30076791/article/details/50571194 ...

    因为最近在学习的过程中,二进制异或等操作上产生了较多的疑问。

    今天就来系统上地学习一下二进制位运算的操作。

    借鉴和简单转载:

    http://blog.sina.com.cn/s/blog_87b866180101lb55.html

    https://blog.csdn.net/qq_30076791/article/details/50571194

    https://blog.csdn.net/chaiwenjun000/article/details/71154235

    基本操作

    1.与运算(AND):0 AND 0 = 0  (全为1才得1)

                        1 AND 0 = 0

                        0 AND 1 = 0

                        1 AND 1 = 1

       用途:用来位置0,若想把FFH(11111111B,255D)第三、五(从右往左)位置0,只需 AND 11101011B(235D,E8H).

       2.或运算(OR): 0 OR 0 = 0  (只要有一个1就得1)

                        1 OR 0 = 1

                        0 OR 1 = 1

                        1 OR 1 = 1

       用途:用来位置1,若想把9EH(10011110B,158D)第二、三、四(从右往左)位置1,只需 

    OR 00001110B(14D,EH).

       3.取反运算(NOT): NOT 1 = 0

                          NOT 0 = 1

       用途:用来整体取反,不能位取反。 

       4. 异或运算(XOR): 0 XOR 0 = 0  (不同为1,相同为0)

                            1 XOR 0 = 1

                            0 XOR 1 = 1

                            1 XOR 1 = 0

       用途:用来位取反,若想把9EH(10011110B,158D)第二、三、四(从右往左)位取反,只需 

    XOR 00001110B(14D,EH).

       附:异或的特殊性:

       若 A XOR B = C,则 A XOR C = B,B XOR C = A.

          扩展成 A XOR B XOR C = D,结论同样成立//PS:我还没证明

    位运算是指按二进制进行的运算。在系统软件中,常常需要处理二进制位的问题。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 <stdio.h>
    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 <stdio.h>
    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 <stdio.h>
    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 <stdio.h>
    main()
    {
     int a=060;
     int b = 017;
     printf("%d",a|b);
    }
    应用:按位或运算常用来对一个数据的某些位定值为1。例如:如果想使一个数a的低4位改为1,则只需要

    将a与17(8)进行按位或运算即可。

    3、“异或”运算符(^)
    他的规则是:若参加运算的两个二进制位值相同则为0,否则为1
    即0∧0=0,0∧1=1,1∧0=1, 1∧1=0
        例:   00111001
            ∧ 00101010
               00010011 
    c语言源代码:
    #include <stdio.h>
    main()
    {
     int a=071;
     int b = 052;
     printf("%d",a^b);
    }
    应用:
    (1)使特定位翻转
    设有数01111010(2),想使其低4位翻转,即1变0,0变1.可以将其与00001111(2)进行“异或”运算,

    即:
     01111010
    ^00001111
     01110101
    运算结果的低4位正好是原数低4位的翻转。可见,要使哪几位翻转就将与其进行∧运算的该几位置为1

    即可。
    (2)与0相“异或”,保留原值
    例如:012^00=012
            00001010
           ^00000000
            00001010
    因为原数中的1与0进行异或运算得1,0^0得0,故保留原数。
    (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 <stdio.h>
    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 <stdio.h>
    main()
    {
     int a=077;
     printf("%d",~a);
    }

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

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

    位得00111100(2)。
    源代码:
    #include <stdio.h>
    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 <stdio.h>
    main()
    {
     int a=0113755;
     printf("%d",a>>1);
    }

    7、位运算赋值运算符

    位运算符与赋值运算符可以组成复合赋值运算符。
       例如: &=, |=, >>=, <<=, ∧=
       例:  a & = b相当于 a = a & b
             a << =2相当于a = a << 2

     

    位运算加速技巧
    1. 如果乘上一个2的倍数数值,可以改用左移运算(Left Shift) 加速 300%

    x = x * 2;
    x = x * 64;
    //改为:
    x = x << 1; // 2 = 21
    x = x << 6; // 64 = 26

    2. 如果除上一个 2 的倍数数值,可以改用右移运算加速 350%

    x = x / 2;
    x = x / 64;
    //改为:

    x = x >> 1;// 2 = 21
    x = x >> 6;// 64 = 26

    3. 数值转整数加速 10%

    x = int(1.232)
    //改为:

    x = 1.232 >> 0;

    4. 交换两个数值(swap),使用 XOR 可以加速20%

    var t:int = a;
    a = b;
    b = t;
    //equals:
    a = a^b;
    b = a^b;
    a = a^b;

    5. 正负号转换,可以加入 300%

    i = -i;
    //改为
    i = ~i + 1; // NOT 写法
    //或
    i = (i ^ -1) + 1; // XOR 写法


    6. 取余数,如果除数为 2 的倍数,可利用 AND 运算加速 600%

    x = 131 % 4;
    //equals:
    x = 131 & (4 - 1);

    7. 利用 AND 运算检查整数是否为 2 的倍数,可以加速 600%

    isEven = (i % 2) == 0;
    //equals:
    isEven = (i & 1) == 0;

    8. 加速 Math.abs 600% 的写法1,写法2 又比写法1加速 20%

    //写法1
    i = x < 0 ? -x : x;

    //写法2

    i = (x ^ (x >> 31)) - (x >> 31);

    //写法3

    i=x^(~(x>>31)+1)+(x>>31);

    9. 比较两数值相乘之后是否拥有相同的符号,加速 35%

    eqSign = a * b > 0;
    //equals:
    eqSign = a ^ b > 0;

    这里5、6、8、9自己都想不出来咋证明。//先放在这里

    给集合里的元素一个顺序,那么就可以用整数表示集合,某一位为1表示对应元素被选取。

            设x为表示集合的整数,那么这个整数有如下性质:

             x的子集整数y在数值上不会比x大。因为x的子集y只是保留了x某些位置上的1,所以y总可以加上一个非负的整数z等于x,相当于把没选的1补上。

             根据这个性质可知,可以通过枚举所有比x小的数p并判断,p是否只含x对应位上的1,如果是则p是x的子集,否则不是。这样时间复杂度是严格的x。有没有更快的呢,有的。

    上诉枚举p是通过减一操作,并且我们知道减一操作一定是正确的,那么在枚举的时候如何快速的去掉多余的状态,答案就是和x进行&(与)运算。与运算可以快速跳到下一个子

    集。

             &运算本质就是保留p在x对应位为1的数值,而根据二进制减法可知减一操作都是把p最低位的1消去,在那一位后全补上1,如果在x对应位为0的地方产生了1其实是无效的,

    后续的减一操作也会把它消掉,所以直接&运算可以快速去掉多余的状态。时间复杂度是x的子集数。

     

    
     
    1. for(int i=x;i;){

    2. i=(i-1)&x;

    3. }

     

    ①判断n是否是2的整次幂 link

    
     
    1. bool fun(int n){

    2. return (!(n & (n-1))) && n;

    3. }




    lowbit(x)是x的二进制表达式中最低位的1所对应的值。
    比如,6的二进制是110,所以lowbit(6)=2。

     

    
     
    1. int lowbit(int x){

    2. return x&(-x);

    3. }

    去除某个数的某一位

     

    
     
    1. bool get_bit(int t,int x) {

    2. // 在 t 中,取出第 x 位 --从零开始

    3. return t & (1<<(x));

    4. }

    改位

     

    
     
    1. #define set_bit(x,ith,bool) ((bool)?((x)|(1<<(ith))):((x)&(~(1<<(ith)))));

    2. //从零开始

    3. // 设置 x 的从第 ith 位起连续 k 位 为bol

    4. int mset(int x,int ith,int k,int bol)

    5. {

    6. while(k --)x = set_bit(x,ith+k,bol);

    7. return x;

    8. }

     

    gcc编译器的内建函数,__builtin_popcount(x)

    直接统计整数x转换成2进制中有多少1。


    bitset

     

    什么是bitset

     

    bitset 是STL库中的二进制容器,根据C++ reference 的说法,bitset可以看作bool数组,但优化了空间复杂度和时间复杂度,并且可以像整形一样按位与或。

    使用方法

    申明

    bitset的申明要指明长度

    1

    bitset<length> bi

    这样就申明了一个长度为length的名叫bi的bitset

     赋值

    bitset重载了[]运算符,故可以像bool数组那样赋值

    bi[2] = 1;

    这样就能将第二位赋值为1

    常用函数

    b1 = b2 & b3;//按位与
    b1 = b2 | b3;//按位或
    b1 = b2 ^ b3;//按位异或
    b1 = ~b2;//按位补
    b1 = b2 << 3;//移位
    int one = b1.count();//统计1的个数

    优化作用

    常常碰到处理的数组只有0和1的变化,此时就可以使用bitset优化。比如求两个集合的交集可以使用按位与运算,求并集可以使用按位或运算


    常用的成员函数:
    b.any() b中是否存在置为1的二进制位?
    b.none() b中不存在置为1的二进制位吗?
    b.count() b中置为1的二进制位的个数
    b.size() b中二进制位数的个数
    b[pos] 访问b中在pos处二进制位
    b.test(pos) b中在pos处的二进制位置为1么?
    b.set() 把b中所有二进制位都置为1
    b.set(pos) 把b中在pos处的二进制位置为1
    b.reset( ) 把b中所有二进制位都置为0
    b.reset( pos ) 把b中在pos处的二进制位置置为0
    b.flip( ) 把b中所有二进制位逐位取反
    b.flip( pos ) 把b中在pos处的二进制位取反
    b.to_ulong( ) 把b中同样的二进制位返回一个unsigned

    //to_ulong()没有看懂,目前到此为止,需要先学习别的内容,这里放下等待看和学习的博客。

    https://blog.csdn.net/qll125596718/article/details/6901935

    展开全文
  • 1.十进制转二进制:(如果是整数)除以2取余,逆序排列,(如果是小数)乘以2取整,顺序排列 例:10(10)=1010(2) 10%2=0 5%2=1 2%2=0 1%2=1 最后表示为二进制就是1010 例: (0.625)10= (0.101)2 0.625X2=1.25 ...

    1.十进制转二进制:(如果是整数)除以2取余,逆序排列,(如果是小数)乘以2取整,顺序排列
    例:10(10)=1010(2)
    10%2=0
    5%2=1
    2%2=0
    1%2=1
    最后表示为二进制就是1010


    例: (0.625)10= (0.101)2
    0.625X2=1.25 ……1
    0.25 X2=0.50 ……0
    0.50 X2=1.00 ……1


    2.二进制转十进制:按权展开求和
    如二进制1010
    1*2^3+0*2^2+1*2^1+0*2^0=10
    (1011.01)2 =(1×2^3+0×2^2+1×2^1+1×2^0+0×2^(-1)+1×2^(-2) )10
    3.二进制转八进制 :从小数点开始,整数部分向左、小数部分向右,每3位为一组用一位八进制数的数字表示,不足3位的要用“0”补足3位,就得到一个八进制数。




    八进制数字与二进制数字对应关系如下:
    000 -> 0
    001 -> 1
    010 -> 2
    011 -> 3
    100 -> 4
    101 -> 5
    110 -> 6
    111 -> 7


    例:将八进制的37.416转换成二进制数:
    3 7 . 4 1 6
    011 111 .100 001 110
    即:(37.416)8 =(11111.10000110)2
    例:将二进制的10110.0011 转换成八进制:
    0 1 0 1 1 0 . 0 0 1 1 0 0
    2 6 . 1 4
    即:(10110.0011)2 = (26.14)8


    4.二进制数转换成十六进制数:从小数点开始,整数部分向左、小数部分向右,每4位为一组用一位十六进制数的数字表示,不足4位的要用“0”补足4位,就得到一个十六进制数。
    0000 -> 0
    0001 -> 1
    0010 -> 2
    0011 -> 3
    0100 -> 4
    0101 -> 5
    0110 -> 6
    0111 -> 7
    1000 -> 8
    1001 -> 9
    1010 -> A
    1011 -> B
    1100 -> C
    1101 -> D
    1110 -> E
    1111 -> F
    例:将十六进制数5DF.9 转换成二进制:
    5 D F . 9
    0101、 1101 1111 .1001
    即:(5DF.9)16 =(10111011111.1001)2


    例:将二进制数1100001.111 转换成十六进制:
    0110 0001 . 1110
    6 1 . E
    即:(1100001.111)2 =(61.E)16




    二进制数的逻辑运算
    逻辑运算是指对因果关系进行分析的一种运算。逻辑运算的结果并不表示数值大小,而是表示一种逻辑概念,若成立用真或1表示,若不成立用假或0表示。二进制数的逻辑运算有“与”、“或”、“非”和“异或”4种。
    “与”运算(AND)
    “与”运算又称逻辑乘,用符号“?”或“∧”来表示。运算规则如下。
    0∧0 = 0 0∧1 = 0 1∧0 = 0 1∧1 = 1。
    即当两个参与运算的数的对应码位中有一个数为0,则运算结果为0,只有两码位对应的数都为1结果才为1。这与前面介绍的二进制数乘法运算是一样的。图2-16是两个“与”的逻辑运算示例。
    “或”运算(OR)
    “或”运算又称逻辑加,用符号“+”或“∨”表示。运算规则如下。
    0∨0 = 0 0∨1 = 1 1∨0 = 1 1∨1 = 1。
    即当两个参与运算数的相应码位只要有一个数为1,则运算结果为1,只有两码位对应的数均为0,结果才为0。图2-17是两个“或”的逻辑运算示例。
    “非”运算(NOT)
    “非”运算实现逻辑否定,即进行求反运算,用符号“—”表示。“非”运算规则:0 = 1,1 = 0。注意“非”运算只是针对一个数所进行的“运算”,这与前面的“与”和“或”运算不一样。它的实质意义就是取反。如“10111101”进行“非”运算后就得到“01000010”,对比相应位即可验证以上运算规则了。
    “异或”运算(XOR)
    “异或”运算用符号“ ”来表示。其运算规则如下。
    0 0 = 0 0 1 = 1 1 0 = 1 1 1 = 0
    即当两个参与运算的数取值相异时,运算结果为1,否则为0。图2-18是两个“异或”逻辑运算示


    3.将负数转换为二进制
    在计算机中,负数以其正值的补码形式表达。
    原码:一个整数,按照绝对值大小转换成的二进制数,称为原码。


    比如 00000000 00000000 00000000 00000101 是 5的 原码。


     


    反码:将二进制数按位取反,所得的新二进制数称为原二进制数的反码。


    取反操作指:原为1,得0;原为0,得1。(1变0; 0变1)


    比如:将00000000 00000000 00000000 00000101每一位取反,得11111111 11111111 11111111 11111010。


    称:11111111 11111111 11111111 11111010 是 00000000 00000000 00000000 00000101 的反码。


    反码是相互的,所以也可称:


    11111111 11111111 11111111 11111010 和 00000000 00000000 00000000 00000101 互为反码。


     


    补码:反码加1称为补码。


    也就是说,要得到一个数的补码,先得到反码,然后将反码加上1,所得数称为补码。


    比如:00000000 00000000 00000000 00000101 的反码是:11111111 11111111 11111111 11111010。


    那么,补码为:


    11111111 11111111 11111111 11111010 + 1 = 11111111 11111111 11111111 11111011




    所以,-5 在计算机中表达为:11111111 11111111 11111111 11111011。转换为十六进制:0xFFFFFFFB。


    -1在计算机里用二进制表达就是全1。16进制为:0xFFFFFF

    展开全文
  • 二进制的四则运算及逻辑运算

    千次阅读 2020-08-03 16:48:07
    因为二进制只有两个数码,一个是0一个是1,也就是0和1之间的运算。 例题 计算37-38的值 解: 分别求得+37和-38的补码:00100101、11011010 。 然后,进行按位求和,得到: 00100101+11011010 = 11111111 所以,...

    在计算机中,数值都是用二进制码表示的。

    四则运算

    加减法(采用补码进行加减法运算)
    在这里插入图片描述
    因为二进制只有两个数码,一个是0一个是1,也就是0和1之间的运算。

    例题
    计算37-38的值
    解:
    分别求得+37和-38的补码:00100101、11011010 。
    然后,进行按位求和,得到:
    00100101+11011010 = 11111111
    所以,[11111111]补 = [10000000]反 + [00000001]=[10000001]原 = [-1]10

    上述操作在计算机内部的过程;
    在这里插入图片描述

    乘法
    在这里插入图片描述
    例题
    计算[1001]2 * [1001]2

    在这里插入图片描述
    所以,[1001]2 * [1001]2 = [1010001]2 = [81]10

    除法
    在这里插入图片描述
    例题
    计算[1010001]2 % [1001]2

    在这里插入图片描述
    所以,[1010001]2 % [1001]2 = [1001]2 。

    逻辑运算

    逻辑运损有“或”、“与”和 “非”三种。

    “或”运算
    在这里插入图片描述

    “与”运算

    “非运算”
    在这里插入图片描述

    展开全文
  • 二进制基础及位运算

    2019-12-04 16:06:09
    二进制计算 每一位上的数基数的索引次幂相加之和 例如:0101=12º+12²=5 第一位1基数2的索引0次幂+第三位1*基数2的2次幂等于5 其他进制计算等同 十进制转2进制:除2求余法 除2求余倒序表示 简便算法:记住2的10次...
  • JS48 JS中的二进制运算和按位操作符

    千次阅读 2019-01-03 17:00:56
    JavaScript中的二进制运算 整数 JavaScript中,将十进制数字转换为二进制的方法是使用toString(2)方法,对于正整数的返回值是从不为零的首位开始返回: (8).toString(2); // 1000 对于负数,不会返回其真正的二进制...
  • 二进制的最高位是符号位:0表示正数,1表示负数; ②正数的原码、反码、补码都一样; ③负数的反码=它的原码符号位不变,其他位取反(0→1,1→0); ④负数的补码=它的反码+1; ⑤0的反码、补码都是0...
  • 第三讲 进制逻辑运算与计算机编程语言这一节课的目的:1、 什么是集成电路,单片机的出现本质上是集成电路的出现,单片机内部结构2、 计算机中数的表示方法(数据、进制及其相互转换),理解位(bit)、字节(byte)的...
  • 问题 ①二进制0-30个数: ②八进制0-80个数 注:将进制的符号进行随意编排,且其顺序只有编写者和接收者知道其顺序,文本内容就相当一次加密。 二进制的简写: 进制的运算(每一个进制体系都是完美的,在运算时...
  • 二进制

    2018-12-10 11:07:39
    引用处: 二进制 二进制和十进制间小数怎么转换 ...的实现直接应用了二进制,因此现代的计算机和依赖计算机的设备里都用到二进制。每个数字称为一个比特bit(二进制位)。计算机中的二进制是一...
  •  计算机指令的运算是基于位的二进制运算, 大学老师教过整型有表示范围, 就算用长整型也是有限的,具体限制与不同语言和不同系统平台有关。不借助库的话是无法实现超级大数运算的。 如计算2^258 + 2^512 用一般的...
  • 二进制,位运算,移位运算 1.二进制 对于原码, 反码, 补码而言, 需要注意以下几点: (1).Java中没有无符号数, 换言之, Java中的数都是有符号的; (2).二进制的最高位是符号位, 0表示正数, 1表示负数; (3).正数的...
  • 函数原型 max(iterable,*[,key,default]) *表示后面的参数只能为关键字参数eg: def f(a,*,b): pass ,/,表示前面的参数只能为...一般的排序顺序为:必填位置参数,设置了默认值的参数,可选参数 数学运算运算...
  • 虽然很早就接触了二进制,却一直没有正视这个问题,阅读《计算机科学导论》的时候,基本上是跳过了这一部分,总是以“这么基础的东西,反正工作中基本用不上”的理由给搪塞过去。最近正在阅读《编码》和《程序员的...
  • 运算速度要快于整数运算的,特别是整数乘法,需要10个或者更多个时钟,若果采用移位操作一个或者2个时钟就够了,不过由于我们常采用十进制来进行算术运算,对二进制的位运算不够熟悉,阅读起来会比较耗费精力,...
  • java 二进制的问题

    2016-07-22 16:30:09
    现在在使用的计算机基本上都是二进制进行运算的。那么二进制有什么好处了?  (1)技术实现简单,计算机是由逻辑电路组成,逻辑电路通常只有两个状态,开关的接通与断开,这两种状态正好可以用“1”和“0”表示。
  • 不同进制运算

    千次阅读 2011-07-22 13:11:33
    二进制、八进制、十进制、十六进制之间转换 一、 十进制与二进制之间的转换 (1) 十进制转换为二进制,分为整数部分和小数部分 ① 整数部分 方法:除2取余法,即每次将整数部分除以2,余数为该位权上的数,而商...
  • 二进制知识详解(理论联系实际)

    千次阅读 2020-01-04 05:29:54
    异或运算表明:不要自我疑惑绪言20190103 二进制知识常用换算进制转换有无符号数双符号位逻辑运算ASCII码常用知识总结规律:20200104异或运算常用结论区分逻辑与按位判断奇偶区别与联系 绪言 本知识点可用于汇编...
  • 二进制基础

    千次阅读 2021-01-08 11:31:13
    二进制 二进制整数 1.计算机为什么使用二进制? 因为计算机最核心的计算原件是CPU,CPU外边有引脚,而引脚是通电用的,通电时有时候通的是高电频有时候通的是低电频,用 “1” 来表示高电频,"0"表示低电频,所以用...
  • 二进制学习

    2019-03-03 11:58:00
    二进制是计算机的基础,计算机只识别二进制数据,其基础运算是采用2进制。编程语言写好的程序经过编译后变成计算机能识别的2进制数据,人不可能直接写2进制数据,其中间需要通过编程语言进行协调,所以编程语言就是...
  • 二进制、八进制、十进制、十六进制关系及转换

    万次阅读 多人点赞 2019-02-21 21:20:22
    二进制,八进制,十进制,十六进制之间的关系是什么?浮点数是什么回事? 本文内容参考自王达老师的《深入理解计算机网络》一书&amp;amp;amp;amp;amp;amp;amp;amp;amp;lt;中国水利水电出版社&amp;amp;amp;amp...
  • 例如,现在要将20转为二进制,那么我们的运算逻辑是: 20 % 2 = 10 余 0 10 % 2 = 5 余 0 5 % 2 = 2 余 1 2 % 2 = 1 余 0 1 % 2 = 0 余 1 然后我们需要将计算出来的数进行逆序排列,得到:10100,这就是20的二进制...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 70,521
精华内容 28,208
关键字:

二进制逻辑运算顺序