精华内容
下载资源
问答
  • 二进制算法

    2019-09-28 07:01:37
    我们经常听到十进制数和二进制数,在计算机中经常用二进制来计算,怎样才能把我们常见的十进制数转换为二进制数呢?  这里我们以十进制数68为例,8*10的0次方+6*10的一次方  45 5*10的0次方+4*10的一次方 ...

        我们经常听到十进制数和二进制数,在计算机中经常用二进制来计算,怎样才能把我们常见的十进制数转换为二进制数呢?

       这里我们以十进制数68为例,8*10的0次方+6*10的一次方  

                                               45           5*10的0次方+4*10的一次方

                                              145          5*10的0次方+4*10的一次方+1*10的二次方

    计算机中的2进制

    01.原码
    02.反码
    03.补码


    1 byte=8 bit;

    01.java中所有的数字都是有符号! 数字的最高位(最左边的)就是符号位!

    红色标注的为高位 0代表正数  1代表负数

    十进制的1   转换为二进制就是   0 0 0 0 0 0 0 1

    十进制的-1   转换为二进制就是  1 0 0 0 0 0 0 1

    02.正数的原码,反码,补码都是一样的!
    03.负数的反码=符号位不变+其他位取反
    04.负数的补码=反码+1
    反码=补码-1
    05.计算机在运行的过程中 都是以 《补码》 运算的!

    1+1

      0 0 0 0 0 0 0 1

    +     0 0 0 0 0 0 0 1

    -------------------------    逢2进1

           0 0 0 0 0 0 1 0   结果为2    

    -2+1

           1 0 0 0 0 0 1 0    ===》-2的原码   需要转换为反码  

           1 1 1 1 1 1 0 1    ===》-2的反码   需要转换为补码

      1 1 1 1 1 1 1 0    ===》-2的补码   补码才能参与运算

    +     0 0 0 0 0 0 0 1    ===》 1的补码    正数的 原码 反码 补码 都一样

    -------------------------

           1 1 1 1 1 1 1 1    ===》 结果为补码  需要转换为反码  再转换为原码

      1 1 1 1 1 1 1 0    ===》 结果为反码

           1 0 0 0 0 0 0 1    ===》 原码  结果为-1 

    java中的位运算

    01.& :按位与 两位全为1,结果为1

    2&3

    运算过程:
       0 0 0 0 0 0 1 0 ==》2的补码
    & 0 0 0 0 0 0 1 1 ==》3的补码
    ---------------------------------
     0 0 0 0 0 0 1 0 ==》 结果2

    02.| :按位或 两位有一个为1,结果为1

    2|3

    运算过程:
      0 0 0 0 0 0 1 0 ==》2的补码
    | 0 0 0 0 0 0 1 1 ==》3的补码
    ---------------------------------
      0 0 0 0 0 0 1 1 ==》 结果3

    03.~ :按位取反 :所有的0变成1,所有的1变成0 (仅限于一个表达式使用)

    ~3
    0 0 0 0 0 0 1 1 ==》3的补码
    ~
    ---------------------------------
    1 1 1 1 1 1 0 0 负数 这是原码
    1 0 0 0 0 0 1 1 反码

    1 0 0 0 0 1 0 0 补码

    ~-5

    1 0 0 0 0 1 0 1 ==》 -5的源码
    1 1 1 1 1 0 1 0 ==》 -5的反码
    1 1 1 1 1 0 1 1 ==》-5的补码
    ~
    ----------------------------------
    0 0 0 0 0 1 0 0 ==》 4

    04. ^ :按位异或 两位一个是1一个是0,结果才是1

    2^3
    0 0 0 0 0 0 1 0
    ^ 0 0 0 0 0 0 1 1
    -----------------------------
    0 0 0 0 0 0 0 1 ==>!



    算术右移:符号位不变 ,低位溢出

    10 >> 2

    0 0 0 0 1 0 1 0
    0 0 0 0 1 0 1 0
    --------------------------------
    0 0 0 0 0 0 1 0

    算术右移:符号位不变 ,低位补0
    2 << 2

    0 0 0 0 0 0 1 0
    0 0 0 0 0 0 1 0
    ---------------------------
    0 0 0 0 1 0 0 0 ==》2的三次方

     

    转载于:https://www.cnblogs.com/wqtzhaoqiang/p/7479050.html

    展开全文
  • #include <iostream> #include <fstream> #include <string> #include <algorithm> using namespace std; string s; int main(int argc,char * argv[]) ...这是算法。想知道思路是什么样的,流程图应该怎么画
  • 首次说明一下,这个算法是针对位数为2^N的二进制数的。 最近在搞Modbus,要求使用偶检验。想起以前看过一个效率很高的算法,但具体的怎样都想不起来,于是上Google搜索了一轮,终于找到当年看过的算法了: 8位的...

    本文链接:https://blog.csdn.net/alleincao/article/details/8174147
    首次说明一下,这个算法是针对位数为2^N的二进制数的。

    最近在搞Modbus,要求使用偶检验。想起以前看过一个效率很高的算法,但具体的怎样都想不起来,于是上Google搜索了一轮,终于找到当年看过的算法了:

    8位的数据D(D7~D0),他的算法为:

    D ^= D >>4;

    D ^= D >>2;

    D ^= D >>1;

    D&=1;

    最后D就是偶校验的值了。

    可能有的同学一时之间看不明白算法的原理,这里解释一下吧。

    首先从D里面找两个位D1和D0,而D1D0的偶校验值E0=D1^D0,这个大家都明白的,然后D3和D2的检验值E1=D3^D2,同理还有E2=D5^D4以及E3=D7^D6;

    E0=1时代表了D1和D0里面有奇数个1,E1、E2和E3同理;

    然后复习一下小学数学:奇数*奇数=奇数,偶数*奇数=偶数

    如果E0和E1里面有奇数个1,那么D3~D0里面就有奇数数个1,此时D3~D0的偶校验值为1;

    “如果E0和E1里面有奇数个1”这句话的意思不就是求由E1和E0组成的两位二进制的偶校验么?而且当E1E0的偶校验值F0=1时,对应的D3~D0的偶校验值也为1。

    同理,E3E2的偶校验值F1=1时,对应的D7~D4的偶校验值也为1;

    继续同理,由F1和F0组成的两位二进制的偶校验G0=1时,对应的是E3~E0的偶校验值为1,同时对应的D7~D0的偶校验值为1。

    于是求D7~D0的偶校验值变成了求F1F0的偶校验值。

    那么首先就要将D7~D0的8个位两两分组后在分别求异或,然后再将得出的值的4个位两两分组后分别异或,最后将得出的值的2个位进行异或,得到的值就是D7~D0的偶校验值了。

    而分组则不必是相邻的,将D右移4位再和原来的D进行异或的话就简单多了

    D7——D3

    D6——D2

    D5——D1

    D4——D0

    如此类推,每次先进行右移,然后和原来的值异或,最终就能得到D的校验值了;另外在计算的过程中,仅仅需要关注后面的位数就可以了,如第二次计算时,高4位会有一些数据,到最后高7位也会有数据的,但这些数据都已经没有用了,所以最后只需要来一个&1就可以l。

    于是文章开头的那段8位二进制数的算法为:

    D ^= D >>4;

    D ^= D >>2;

    D ^= D >>1;

    D&=1;

    另外对于2^N位二进制数,第一次右移(2^N)/2位后再异或,然后重复类似的计算N次就可以了。
    参考:
    原文链接:

    https://blog.csdn.net/alleincao/article/details/8174147

    https://mp.weixin.qq.com/s/cdc8lyss226jnruQii6Zkw

    展开全文
  • 二进制不是智能--二进制将人奴化

    千次阅读 2010-02-09 18:06:00
    现如今多少人热衷于繁复的算法,致力于人工智能的开发,本质上这些东西都是由计算机实现的,而现在的计算机基本都是基于二进制的,二进制最基本的特征就是确定性,不管怎样给出一个初始状态,最终都会得到一个稳定...

    现如今多少人热衷于繁复的算法,致力于人工智能的开发,本质上这些东西都是由计算机实现的,而现在的计算机基本都是基于二进制的,二进制最基本的特征就是确定性,不管怎样给出一个初始状态,最终都会得到一个稳定并且唯一的结果,在是与非的世界中,真正的随机是不可能的!正如法律和法规越严密,人们的生活越单调一样,与其说人们在朝着人工智能的方向前进,倒不如说人们正在一步一步逼近人工机器,人类的行为越来越机械化,绝妙的音乐,美术作品,诗词曲赋正在消失,优秀的基因正在被机器一点一点吞噬殆尽,不是说机器越来越智能,而是说人类越来越机器化。

    人类从是与非中找到了捷径,本来可以成为艺术家的人甚至都可以去走这条捷径,于是真正的艺术家消失了,更多的是制作人,依赖的仅仅是基于是与非的代码逻辑。艺术作品的产生是真正的智能的产物,然而艺术作品的产生是痛苦和折磨交配的结晶,人们不再痛苦,社会日趋和谐,于是艺术作品少了,这也许是人类最终会灭亡的原因之一吧!机器带来的舒适正在一步一步奴化世界上的每一个使用机器的人,人们成了机器的奴隶,所以研究人工智能的人也是被奴化的人,并且是受教最深的人,他们正在研究的东西其实是为了机器更好的奴化人类,可以这么说,他们是机器的走狗!真正的智能产生过程是一个阵痛的过程,需要的不是二元化的是与非,而是更多更丰富的中间状态,不是1和0,而是0.5,0.34278,0.4,1/3,3.1415926.../3等等,每一个数字都是一种艺术,机器剥夺了这一切,人类从此愚昧!

    展开全文
  • 在windows下x.509的证书以默认的加密外壳扩展打开,直接可以看到版本、序列号、算法、颁布者等信息,但是怎样才能得到原始的二进制呢?
  • 二进制那些事

    2018-04-25 21:37:24
    理清字符集和字符编码关系中介绍到计算机内部由集成电路决定了计算机的信息只能用二进制数处理。本期将介绍二进制那些事。 移位运算 移位运算指的是将二进制数值的各数位进行左右移位的运算。左移空出来的低位要...

    理清字符集和字符编码关系中介绍到计算机内部由集成电路决定了计算机的信息只能用二进制数处理。本期将介绍二进制那些事。

    移位运算

    移位运算指的是将二进制数值的各数位进行左右移位的运算。左移空出来的低位要进行补0操作,右移空出来的高位要进行怎样的操作,我们会在后面说明。
    image.png

    我们发现,左移两位相当于对39乘以4,右移两位相当于除4,也就是说计算机用移位算法来表示数据的乘除运算

    补数

    刚才之所有没有介绍相关右移的内容,是因为用来填充右移后空出来的高位的数值,有 0 和 1 两种形式。要想区分什么时候补0什么时候补1,只要掌握了用二进制数表示负数的方法即可。

    二进制数中表示负数时,一般会把最高位作为符号来使用,也就是说,最高位是符号位。正数的符号位用0表示,负数的符号位用1表示。举个栗子,1的二进制数是0000 0001 ,那么,-1的二进制数是多少呢?难道是1000 0001,1000 0001+0000 0001 结果不是0,说明这个结果是错的。为此,在表示负数时就需要使用补数补数就是用正数表示负数,通过将二进制数的各位数值全部取反,然后再将结果加1得到补数。-1的补数是1111 1111。同理,1111 1110表示的负数是多少呢?这时我们可以利用负负得正这个性质。假设1111 1110是负xx,那么1111 1110的补数是正xx。1111 1110的补数是0000 0010,因此1111 1110表示-2。

    逻辑右移和算术右移

    在介绍完补数后,让我们返回到右移这个话题,右移之后在最高位有补0和补1两种情况。当二进制数的值表示图形模式而非数值时,移位后在最高位补0,这是逻辑右移。将二进制数值作为带符号的数值进行运算时,移位后要在最高位填充前符号位的值( 0 或 1 ),这是算术右移

    现在我们来看一个右移的例子。将-8(1111 1000)右移两位。这时,逻辑右移的情况下结果会是 0011 1110,也就是十进制数62,显然不是-2,而在算术右移的情况下,结果会变成1111 1110 ,用补数表示就是-2,和真实结果相同。需要注意的是只有在右移时才区分逻辑移位和算术移位。

    二进制数表示小数

    通过上述介绍,我们对整数的二进制表示方式做了说明。由于计算机内部所有信息都是以二进制数的形式来处理,因此在这一点上,整数和小数并无差别。不过,使用二进制数表示整数和小数的方法却有很大的不同。

    由于二进制数表示的小数的数值范围是有限的,并不能表示所有的十进制小数。例如:小数点后3位用二进制数表示时的数值范围为0.000~0.111,但是只能表示有限的十进制小数,如下图所示。
    image.png
    为了加深大家印象,举一个更加实际的栗子:将0.1累加100次最终结果是10.000002,不是10。

    public class TestBinary {
        public static void main(String[] args) {
            float sum=0.0f;
            for (int i = 0; i < 100; i++) {
                sum += 0.1;
            }
            System.out.println(sum);
    
        }
    }
    

    浮点数

    现在,我们应该知道仅仅依靠纸面上的二进制数是表示不了全部小数。那么,计算机实际上是以什么样的表现形式来处理小数的呢?

    目前,计算机提供了单精度浮点数和双精度浮点数来表示小数形式。单精度浮点数用32位表示全体小数,而双精度浮点数用64位表示。它们都是由符号、尾数和指数组成。
    image.png

    接下来,让我们一起看一下如果将0.1用单精度浮点数来表示,累加100次的结果是否是10,可以结果又一次出乎意料,结果是10.000002。

        public static void main(String[] args) {
            float sum=0.0f;
            float step = 0.1f;
            for (int i = 0; i < 100; i++) {
                sum += step;
    
            }
            System.out.println(sum);
    
        }
    }

    如何避免计算机计算出错

    我们知道,无论是用纸面二进制还是浮点数表示小数,都存在计算出错的可能性,那么我们该如何避免这种问题呢?

    首先是回避策略,即无视这些问题。有时候一些微小的偏差并不会造成什么问题。其次,把小数转换成整数来计算。还是以0.1累加100次为例,将0.1扩大10倍后累加100次,最后把结果除以10就可以了。

    public class TestBinary {
        public static void main(String[] args) {
            int sum=0;
            int step = 1;
            for (int i = 0; i < 100; i++) {
                sum += step;
    
            }
            System.out.println(sum/10);
    
        }
    }

    image

    欢迎关注微信公众号:木可大大,所有文章都将同步在公众号上。

    展开全文
  • 首先,我们得知道十进制怎样转化成二进制,如下图。 得到10的二进制数为1010 那么我们会发现,10%2是判断二进制数的最后一位是0还是1,判断完成后向右移一位即10/2得到5,接着5%2判断二进制数的倒数第二位是0...
  • 我使用C编码创建了二进制文件.这是该二进制文件的结构.struct emp{int eid,eage;char name[20],city[20];}record;使用这个’C’结构我创建了一个名为“table1.txt”的二进制文件现在我想使用php在网页中显示文件的...
  • 二进制转换【转】

    2019-05-24 13:19:49
    对于二进制一直不是很有感觉,看到了一篇比较好的博文,将二进制输出的算法总结的差不多了, 一起学习一下,原文网址https://blog.csdn.net/sodacoco/article/details/81624915 看《编程之美》第二节的时候,它是...
  •   题目:输入一个整数,求该整数的二进制表达中有多少个1。例如输入10,由于其二进制表示为1010,有两个1,因此输出2。 分析:这是一道很基本的考查位运算的面试题。包括微软在内的很多公司都曾...
  • 对于二进制一直不是很有感觉,看到了一篇比较好的博文,将二进制输出的算法总结的差不多了, 一起学习一下,原文网址https://www.jb51.net/article/92462.htm 看《编程之美》第二节的时候,它是定义的一个整型,...
  • 狼羊菜问题的算法思想和C++实现 狼羊菜问题 把【狼、羊和蔬菜】这三样东西安全地送至河的对面,你能用的工具只有身边的一艘小船。...用二进制表示狼羊菜在两岸的状态。例如:0101011,前三位表示对岸有羊...
  • 怎样才能让士兵渡过河,并且留下两个男孩操纵这条船?这条船要在岸与岸之间横渡多少次?解答:每次只能容纳一名士兵,所以士兵一定是一个一个过河,同时需要有小男孩将船划回来,那么每一次士兵过河之前,两个小男孩...
  • 前面讲到布思算法的计算机底层模拟的时候,我们是借助于一个可以储存、表示任意N位的二进制补码的BinaryQueue实现的,现在我们模拟计算机底层整数除法还是要借助于它: BinaryQueue类代码:...
  • 输入一个整数,求该整数的二进制表达中有多少个1。 例如输入10,由于其二进制表示为1010,有两个1,因此输出2。   思路一: 这是一道很基本的考查位运算的面试题。一个很基本的想法是,我们先判断整数的最右边...
  • 题目:如何以最快的速度计算出一个二进制数中1的个数 重点在于,这里有十亿或万亿个int数字,怎样做才能优化算法呢?解答:统计一个字节序列中1的个数,我首先想到的是最简单,把这个数每次右移一位,然后与0x01...
  • 对于一个C语言初学者来讲,用简单的算法实现十进制向二进制的转换输出应该难度不算太大,但是在某些情况下需要做出一道质量过得去的代码来实现十进制向任意进制(2-16)转换还是有点思维误区的,特别在数据的存储...
  • 遗传算法入门(连载之三)

    千次阅读 2009-01-06 11:25:00
    3.2二进制数速成(A Quick Lesson in Binary Numbers) 当进入更深层... 我认为了解二进制数(基为2的数)的最容易的方法,就是首先查看一下十进制数:你为什么使用十进制数字(基为10的数)和怎样使用十进制计数? 
  • 那么二进制、八进制、十进制、十六进制的数字,究竟是怎样计数的?它们之间是怎样相互换算的?本文就来详细说说这两个问题。 一、多种进制的计数方法 首先来说我们最熟悉的十进制。十进制计数法有10个原始的数字,...
  • 十进制负整数转二进制算法 计算机数据的存储 数据的存储方式 机器以正负电子的排列等方式来记录二进制数据 排列?不同数量、不同排列顺序 存储在什么地方 硬盘、内存 怎样存储 因为目前计算机能够存储的数据...
  • 文章目录一、前言二、栈(Stack)2.1基于数组的栈结构应用:十进制转二进制2.2基于链表的栈结构应用:十进制转二进制 一、前言 1.1.什么是数据结构? 数据结构就是在计算机中,存储和组织数据的方式。 例如:图书...
  • 6对应二进制为:000110 高3位:000=0通过OSMapTbl映射后:OSMapTbl[prio>>3]=OSMapTbl[0]=00000001 低3位:110=6通过OSMapTbl映射后: OSRdyTbl[prio>>3]=OSRdyTbl[0]=010******* 10对应二进制为:...
  • 易语言经典算法

    2011-10-19 23:22:35
    十进制转为二进制 九连环 找窃贼 哥德巴赫猜想 最小生成数 农夫过河 旅游最省钱路径 马克思手稿中的数学题 上楼梯(递归).e 上楼梯(非递归) 金额大小写转换 求一元二次方程的根(二分法) 数字与IP地址间的转换 八皇后...

空空如也

空空如也

1 2 3 4 5 ... 7
收藏数 140
精华内容 56
关键字:

怎样二进制算法