精华内容
下载资源
问答
  •      计算机内部所有信息都用二进制(即... 由于小数部分在进行进制转换时,有些小数不能精确转换成二进制,所以C语言中对浮点型数与0进行相等比较时,一般写成: float num = 0.1; if (-0.000001 < num &&a



    计算机内部所有信息都用二进制(即:0和1)进行编码,机器级数据分两大类:

    • 数值数据:无符号整数、带符号整数、浮点数(实数)
    • 非数值数据:逻辑数(包括位串)、西文字符和汉字

    在这里插入图片描述


    如果要表示数值数据,就必须确定进位计数制,通常需要将十进制数据转换成其它进制数据,转换方法如下:

    在这里插入图片描述

    由于小数部分在进行进制转换时,有些小数不能精确转换成二进制,所以C语言中对浮点型数与0进行相等比较时,一般写成:

    float num = 0.1;
    if (-0.000001 < num && num < 0.00001)
    {}
    


    在这里插入图片描述

    计算机数值类型数据分为:定点数与浮点数。小数点位置确定的数就是定点数,包括定点小数与定点整数; 浮点数就是一般我们用到的实数。对于浮点数的存储,通过存储符号位尾数阶数实现。
    在这里插入图片描述

    展开全文
  • 题目:如何以最快的速度计算出一个二进制数中1的个数 重点在于,这里有亿或万亿个int数字,怎样做才能优化算法呢?解答:统计一个字节序列中1的个数,我首先想到的是最简单,把这个数每次右移一位,然后与0x01...

    题目:如何以最快的速度计算出一个二进制数中1的个数
    重点在于,这里有十亿或万亿个int数字,怎样做才能优化算法呢?

    解答:

    统计一个字节序列中1的个数,我首先想到的是最简单,把这个数每次右移一位,然后与0x01逻辑与进行统计,相当于总共将真个字节序列遍历了一遍。然而仔细想想,一个十亿或万亿的字节序列,能存到一个数(或称为变量)中?必然不可以,因此这是陷阱所在。

    while(num)
    {
        if(num & (0x1 ) == 0x1)
        { 
            count ++; 
            num >>= 1;
        }
    }

    深入思考,既然是字节序列,那我解释成任何数据类型都是可以的啊,我可以按照32位机器的int大小,比如4个字节来把这么长的字节序列读到一个个的Int值中,然后统计每个int值的位中1的个数,加起来就可以了。

    方法18bit静态表查找法 Precompute_8bit
    
        static int bits_in_char [256] = {             
    
        0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4, 1, 2, 2, 3, 2, 3, 3, 4, 2,
    
        3, 3, 4, 3, 4, 4, 5, 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, 2, 3,
    
        3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3,
    
        4, 3, 4, 4, 5, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 2, 3, 3, 4,
    
        3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5,
    
        6, 6, 7, 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, 2, 3, 3, 4, 3, 4,
    
        4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5,
    
        6, 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, 2, 3, 3, 4, 3, 4, 4, 5,
    
        3, 4, 4, 5, 4, 5, 5, 6, 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, 3,
    
        4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, 4, 5, 5, 6, 5, 6, 6, 7, 5, 6,
    
        6, 7, 6, 7, 7, 8
    
        };
    
        int bitcount (unsigned int n)
    
        {
    
            // works only for 32-bit ints
    
            return bits_in_char [n & 0xffu]
    
                 + bits_in_char [(n >>8) & 0xffu]
    
                 + bits_in_char [(n >> 16) & 0xffu]
    
                 + bits_in_char [(n >> 24) & 0xffu] ;
    
         }
    
        使用静态数组表,列出所有8bit(256个)无符号数含有Bit1的个数。将32Bit 的n分4部分,直接在表中找到对应的Bit1的个数,然后求和。
    
        显然,牺牲了时间换取了空间。
    方法2//源自 微软 的一道面试题
    
    int GetNumOfOne(int x)
    {
        int count = 0;
        while (x)
        {
            count++;
            x = x & (x - 1);
        }
        return count;
    }
    //原理:一个数减去1,则这个数的二进制数中最后一个1及其后的数字取反。
    //     x & (x - 1) 为它的二进制数中少一个1
    方法3//以32位为例子:
    //将n写成二进制形式,然后相邻位相加,重复这个过程,直到只剩下一位。以123为例,二进制为1111101,如下图:
    void find32One(int n) 
    {
    
            const int MASK1 = 0x55555555;
            const int MASK2 = 0x33333333;
            const int MASK4 = 0x0f0f0f0f;
            const int MASK8 = 0x00ff00ff;
            const int MASK16 = 0x0000ffff;
    
            n = (n & MASK1) + ((n >> 1) & MASK1);
            n = (n & MASK2) + ((n >> 2) & MASK2);
            n = (n & MASK4) + ((n >> 4) & MASK4);
            n = (n & MASK8) + ((n >> 8) & MASK8);
            n = (n & MASK16) + ((n >> 16) & MASK16);
    
            cout << n << " number of 1." << endl;
    }

    //图解:

    这里写图片描述

    展开全文
  • 程序员二进制计算器 v1.36

    热门讨论 2014-07-16 16:21:43
    对于整型值,默认按十进制输出,此时%d可省略。 %d 123456789 = 123456789 (4)按十六进制输出 %x或%X 用%x时,字母abcdef输出为小写,用%X时,字母abcdef输出为大写。 %x 31 = 0x1f %X 31 = 0X1F (5)...
  • 十进制的数值运算在计算机里都将转换成二进制的数值运算,而二进制的运算就是cpu中最根本的逻辑运算,最后再转化成十进制输出。这次介绍的方法是保留十进制的运算方式(小学生的列竖式计算),仅仅将每位数字转换成...

    另类四则运算之大整数加减法:

    十进制的数值运算在计算机里都将转换成二进制的数值运算,而二进制的运算就是cpu中最根本的逻辑运算,最后再转化成十进制输出。这次介绍的方法是保留十进制的运算方式(小学生的列竖式计算),仅仅将每位数字转换成二进制。这种算法既在速度上有所提升,又能克服单个数据存储大小的限制。因此可以用来进行大整数的加减法(大整数通常指16位或32位以上整型数)。至于竖式计算的原理就不说了哦,不然有损大家的智商!

     

    核心:模拟竖式计算,将大整数的每一位分开来存储与计算。

     

    C语言完整程序:

    //大整数加法:

    #include

    #include

    char a[100],b[100];

    int c[100],d[100];

    int main()

    {

             int m,n,i,j;

             scanf("%s %s",a,b);

             m=strlen(a);

             n=strlen(b);

             for(i=0;i<=m-1;i++)

             c[i]=a[m-1-i]-'0';

             for(i=0;i<=n-1;i++)

             d[i]=b[n-1-i]-'0';

             for(i=0;i<=99;i++)

             {

                       c[i]+=d[i];

                       if(c[i]>=10)

                       {

                                c[i]-=10;

                                c[i+1]+=1;

                       }

             }

             for(i=99;i>=0;i--)

             {

                       if(c[i]!=0)

                       {j=i;break;}

        }

        for(i=j;i>=0;i--)

        printf("%d",c[i]);

    }


    //大整数减法:

    #include

    #include

    char a[100],b[100];

    int c[100],d[100];

    int main()

    {

             int m,n,i,j;

             scanf("%s %s",a,b);

             m=strlen(a);

             n=strlen(b);

             for(i=0;i<=m-1;i++)

             c[i]=a[m-1-i]-'0';

             for(i=0;i<=n-1;i++)

             d[i]=b[n-1-i]-'0';

             for(i=0;i<=99;i++)

             {

                       c[i]-=d[i];

                       if(c[i]<0)

                       {

                                c[i]+=10;

                                c[i+1]-=1;

                       }

             }

             for(i=99;i>=0;i--)

             {

                       if(c[i]!=0)

                       {j=i;break;}

        }

        for(i=j;i>=0;i--)

        printf("%d",c[i]);

    }

    展开全文
  • 二进制加法与十进制的加法相似,难点在于怎么处理进位,解决了加法位和进位位之间的协作,就很轻松的实现. 进位位的实现: 进位位 输入A 输入B 0 0 0 0 0 1 0 1 0 1 1 1 从上表的二进制进位规则难...

    加法是算数运算中最基本的运算,而加法运算也能说是计算机要做的唯一工作!
    二进制加法与十进制的加法相似,难点在于怎么处理进位,解决了加法位和进位位之间的协作,就能很轻松的实现.

    进位位的实现:

    进位位 输入A 输入B
    0 0 0
    0 0 1
    0 1 0
    1 1 1

    从上表的二进制进位规则不难看出,进位规则和与门规则相同;因此,我们可以利用与门进行二进制数加法的进位.

    加法位的实现:

    加法位 输入A 输入B
    0 0 0
    0 1 1
    1 0 1
    1 1 0

    加法位的情况并不像进位位那般简单.

    但我们可以将它拆分. 下面两行输出,可以看出和或门输出相同; 而上面两行的输出和与非门的结果相似, 现在先让我们将或门和与非门连接到相同的输入上.
    在这里插入图片描述

    输入A 输入B 或门输出 与非门输出 期待值
    0 0 0 1 0
    0 1 1 1 1
    1 0 1 1 1
    1 1 1 0 0

    而我们想要的结果是1, 这种情况只有在或门和与非门输出都为1的情况下才会出现, 这也表面我们可以用一个与门将两个输出端连接.这像什么?

    是的, 这就是上一章将到的异或门. 异或门只有在输入端不同才为1, 否则为0.

    半加器实现:

    现在我们已经知道了怎么计算两个一位二进制数的和,让我们将它组装起来.
    在这里插入图片描述
    通常为了避免重复绘制, 可以采用下面简单的表示方式.
    在这里插入图片描述
    这个符号被称为半加器, 将两个一位二进制数进行加法运算, 得出一个加法位和一个进位位, 但大部分数据运算都不可能只有一位, 所有它只完成了一半工作, 半加器.

    而在我们日常加法运算中, 如果遇到有进位出现, 那么下一个数字将要进行三个数字的加和运算: 加数. 被加数, 进位位. 除了个位只需要处理两个数值, 后续基本都需要处理三个数值.

    为了对三个数值进行加和运算, 我们需要两个半加器和一个或门做如下链接.
    在这里插入图片描述
    现在让我们来理解它的工作原理. 首先从最左边第一个半加器的两个输入端开始, 其输出一个加和以及相应进位; 这个和必须与前一位数的进位相加, 再输出到第二个半加器. 第二个半加器输出的和是最后的结果. 两个半加器的进位输出又被输入到一个或门中.

    这里并不需要再连接一个半加器, 因为两个半加器的进位输出是不会同时为1的, 或门在这里已经足够用了.

    会起名字的朋友已经猜对了, 上面的组合就是一个全加器. 在这里插入图片描述
    8位加法器实现:

    现在我们已经知道了二进制加法的工作原理: 除了第一位数字外, 其它的位数需要三个输入端( 上一位的进位, 加数, 被加数 ), 两个输出端( 加和输出, 进位输出 ); 而进位输出又成为下一位的进位输入.

    让我们将它们拼起来, 形成一个黑盒.
    在这里插入图片描述
    上图中下标为0的输入输出端为最低有效位. 你可能注意到了左右两端的进位输入 / 输出端口, 这是为了串联预留的接口; 这是一个突破, 一旦你实现了8位加法器, 通过串联你就可以实现16位, 32位, 64位加法器.

    仅仅只是一个8位加法器能执行的运算实在有限, 玩过开发板的朋友应该也清楚. 这是因为8位所能表示的数据有限.

    计算机的所有运算从本质上来说都是加法运算, 下一章将讲述计算机中的减法运算, 它与加法运算有点不同. 你也会在下一章了解编程语言中的 int 类型取值范围, 负数表示, 为什么字节是8比特, 不是7, 不是6, 不是10…

    展开全文
  • 计算机组成原理 机器数的移位运算

    千次阅读 2016-06-20 11:08:14
    移位操作是将数值向左或向右移动,对于十进制来说就是实现放大十倍和缩小十倍的效果,而对于二进制就是放大两倍和缩小两倍的效果。 1.逻辑移位 对于逻辑移位,就是考虑符号,移位的结果只是数据所有的位数进行...
  • 将子网掩码和IP地址按位进行逻辑“与”运算,得到IP地址的网络地址,剩下的部分就是主机地址,从而区分出任意IP地址中的网络地址和主机地址。子网掩码常用点分十进制表示,我们还可以用网络前缀法表示子网掩码,即...
  • 有一些数是没有以准确的精度来存储的,因为在计算机中,这些数进行计算都是根据二进制码进行的,把一个十进制的数转换为二进制,计算机所存储的位数有上限,这就会导致最后的出来的数精确,如果解决这个问题呢,...
  • 第一章 判断题 (X )1.第一台电子计算机是为商业应用而研制的 (X ) 2.第一代电子计算机的主要元器件是晶体管 (V) 3....运算器不仅能进行算术运算而且还能进行逻辑运算 (V) 7.计算机不能直接运行用高级语言编写的程序 (V
  • 注意向段寄存器传送数据的方法(CS位代码段基地址寄存器,不能做目的地址,立即数不能直接传送给段基地址寄存器),注意代码段寄存器CS不能作为目的寄存器; 3、掌握8086的寄存器及其使用方法,注意AX、BX、CX、DX...
  • 微机学习要求答案

    2018-11-27 19:19:38
    注意向段寄存器传送数据的方法(CS位代码段基地址寄存器,不能做目的地址,立即数不能直接传送给段基地址寄存器),注意代码段寄存器CS不能作为目的寄存器; 3、掌握8086的寄存器及其使用方法,注意AX、BX、CX、DX...
  • 摘要 计算器是能进行数学运算的手持机器....该计算器要求实现基本四则运算,统计运算,三角运算,对数运算,逻辑运算以及十六进制,八进制,十进制,二进制的转换。 关键词:计算器,Delphi,编程
  • 计算机处理数据的过程有时候我们难以理解或者想通,到底补码是什么,竖式相减什么时候能用,符号位的0和1能不能参与运算,这些本来是大一的知识,今天做一下整理: 首先,我们先梳理一下人是怎么进行计算的: 对于8...
  • 按 F8,弹出十六进制和十进制转换器,左边栏显示十六进制数字,右边栏显示十进制数字。如果你在左边输入十六进制数,按 Enter 其十进制结果就出现在右边的矩形框中了,反之亦然。如果你按组合键 Alt+F8,可调用系统...
  • 023 (不能有前导0) 23D (含有非十进制数码)  在程序中是根据前缀来区分各种进制数的。因此在书写常数时不要把前缀弄错造成结果不正确。4.整型常数的后缀在16位字长的机器上,基本整型的长度也为16位,因此表示的...
  • 易语言 茶凉专用模块

    2010-05-04 12:26:36
    不能对最小化窗口设置(成功返回真,失败返回假) .参数 句柄, 整数型, , 欲置焦点的窗口句柄 .子程序 窗口状态控制, 逻辑型, 公开, 控制窗口状态(成功返回真,失败返回假) .参数 临时句柄, 整数型, , 窗口句柄 .参数 ...
  • 自第一版出版以来,都是国内读者的普遍好评,累计销量近万册。 《C#高级编程(第7版)》的顶级专家作者团队首先复习了C#的基础知识,之后详细讲解了该语言和架构中的所有新增功能,使读者立即开始编写 Windows...
  • 自第一版出版以来,都是国内读者的普遍好评,累计销量近万册。 《C#高级编程(第7版)》的顶级专家作者团队首先复习了C#的基础知识,之后详细讲解了该语言和架构中的所有新增功能,使读者立即开始编写 Windows...
  • 自第一版出版以来,都是国内读者的普遍好评,累计销量近万册。 《C#高级编程(第7版)》的顶级专家作者团队首先复习了C#的基础知识,之后详细讲解了该语言和架构中的所有新增功能,使读者立即开始编写 Windows...
  • 自第一版出版以来,都是国内读者的普遍好评,累计销量近万册。 《C#高级编程(第7版)》的顶级专家作者团队首先复习了C#的基础知识,之后详细讲解了该语言和架构中的所有新增功能,使读者立即开始编写 Windows...
  • 自第一版出版以来,都是国内读者的普遍好评,累计销量近万册。 《C#高级编程(第7版)》的顶级专家作者团队首先复习了C#的基础知识,之后详细讲解了该语言和架构中的所有新增功能,使读者立即开始编写 Windows...
  • 自第一版出版以来,都是国内读者的普遍好评,累计销量近万册。 《C#高级编程(第7版)》的顶级专家作者团队首先复习了C#的基础知识,之后详细讲解了该语言和架构中的所有新增功能,使读者立即开始编写 Windows...
  • 自第一版出版以来,都是国内读者的普遍好评,累计销量近万册。 《C#高级编程(第7版)》的顶级专家作者团队首先复习了C#的基础知识,之后详细讲解了该语言和架构中的所有新增功能,使读者立即开始编写 Windows...
  • 自第一版出版以来,都是国内读者的普遍好评,累计销量近万册。 《C#高级编程(第7版)》的顶级专家作者团队首先复习了C#的基础知识,之后详细讲解了该语言和架构中的所有新增功能,使读者立即开始编写 Windows...
  • 自第一版出版以来,都是国内读者的普遍好评,累计销量近万册。 《C#高级编程(第7版)》的顶级专家作者团队首先复习了C#的基础知识,之后详细讲解了该语言和架构中的所有新增功能,使读者立即开始编写 Windows...
  • 自第一版出版以来,都是国内读者的普遍好评,累计销量近万册。 《C#高级编程(第7版)》的顶级专家作者团队首先复习了C#的基础知识,之后详细讲解了该语言和架构中的所有新增功能,使读者立即开始编写 Windows...
  • 2004-2010软考程序员真题

    热门讨论 2012-09-27 12:33:00
     28、在Windows98中,不能进行打开"资源管理器"窗口的操作是  A)用鼠标右键单击"开始"按钮 B)用鼠标左键单击"任务栏"空白处  C)用鼠标左键单击"开始"菜单中"程序"下的"Win  dows资源管理器"项 D)用鼠标右键单击...

空空如也

空空如也

1 2 3 4 5 6
收藏数 110
精华内容 44
关键字:

十进制不能进行逻辑计算