精华内容
下载资源
问答
  • 数据的二进制表示

    千次阅读 2020-02-05 17:07:43
    数据的二进制表示 文章目录数据的二进制表示基础定义二进制 基础定义 位: IC 电子元件有不同种形状,但是其内部的组成单元称为一个个的引脚。只有直流电压0V 或 5V 两个状态。与 “0” 与“1”的表达不谋而合 字节...

    基础定义

    : IC 电子元件有不同种形状,但是其内部的组成单元称为一个个的引脚。只有直流电压0V 或 5V 两个状态。与 “0” 与“1”的表达不谋而合
    在这里插入图片描述

    字节:8 位二进制数被称为一个 字节

    为什么拟定 8 位为一个字节?
    因为 8 位能够涵盖基本的字符编码(英文 26 个字母大小写 + 基本符号位等)

    实例:

     一个英文字母-----占一字节
    
    一个中文字-------占二个字节
    
    一个整数---------占二个字节
    
    一个实数---------占四个字节
    

    图:
    在这里插入图片描述

    二进制

    位权:进制数值中某个位的权重值
    例如:
    十进制数 39 的各个数位的数值,并不只是简单的 3 和 9
    3 表示的是3×10 = 30,9 表示的是 9×1 = 9
    这里和各个数位的数值相乘的 10 和 1,就是位权

    基数:数值的表现方法,进位计数制中各数位上可能有的数值的个数。十进制数的基数是 10,二进制数的基数是 2

    二进制转十进制的理解
    核心:基数 x 位权

    十进制数:
    如 39 这个十进制数,表示的就是 30+9

    二进制数:
    00100111 用十进制数表示的话是 39,因为(0×128)+(0×64)+(1×32)+(0×16) +(0×8)+(1×4)+(1×2)+(1×1)= 39

    补数:将二进制数的值取反后加 1 的结果

    为什么使用补数后就能正确地表示负数了呢?
    实际上是验证:补数与原来的数相加是否为 0
    “将二进制数的值取反后加 1 的结果,和原来的值相加,结果为 0”这一法则
    例子:
    00000001+11111111
    图:
    在这里插入图片描述

    减法运算
    计算机在做减法运算时,实际上内部是在做加法运算。

    进位法则: 对各个进制的数都满足,满基数,向(当前位权+1)进1
    备注:楼主表示纠结这个概念了半天| :( |

    符号位
    二进制数中表示负数值时,一般会把最高位作为符号来使用,因此我们把这个最高位称为符号位。符号位是 0 时表示正数 ,符号位是1 时表示负数。
    错误事例
    “1 的二进制数是 00000001,因此-1 就是 10000001”
    正确事例
    “1 的二进制数是 00000001,因此-1 就是 11111111”

    符号位的应用
    有的可以处理负数,有的则不能处理。例如,C 语言的数据类型中,既有不能处理负数的 unsigned short 类型,也有能处理负数的 short 类型。这两种类型,都是 2 字节(= 16 位)的变量,都能表示 2 的 16 次幂 = 65536 种值,这一点是相同的。
    不过,值的范围有所不同,short 类型是- 32768~32767,unsigned short 类型是 0~65535。此外,short 类型和 unsigned short 类型的另一个 不 同 点 在于,short 类 型 是 将 最 高 位 为 1 的 数 值 看 作 补 数, 而unsigned short 类型则是 32768 以上的值。

    为什么总说最高位为 1 时是负数,为 0 时是正数?那么十进制的255用二进制表示就是1111-1111,可是二进制最高位是1的时候是负数,这个应该怎么理解?

    整数分为“有符号整数”和“无符号整数”,以8位的二进制而言:
    如果按无符号整数来用,那么最小值0(二进制0000-0000),最大值是255(1111-1111),总数是256个
    而如果作为有符号整数来用,则最小值为-128(二进制1000-0000),最大值为127(0111-1111),总数也还是256个
    题目中的 " 1111-1111 " 在 “有符号整数”中就不能够表示为 255 了,所以在依据最高位来判断正负数时,应该视具体情况而定

    逻辑右移与算数右移的区别
    算数右移有移位后在最高位补 0 和补 1 两种情况(视数值为正数或者负数)
    当二进制数的值表示图形模式而非数值时,移位后需要在最高位补 0。类似于霓虹灯往右滚动的效果。这就称为 逻辑右移
    图:
    在这里插入图片描述
    符号扩充
    符号扩充就是指在保持值不变的前提下将其转换成 16 位和 32 位的二进制数
    不管是正数还是用补数表示的负数,都只需用符号位的值(0 或者 1)填充高位即可
    图:
    在这里插入图片描述
    逻辑运算
    包括逻辑非(NOT 运算)、逻辑与(AND 运 算)、逻辑或(OR 运算)和逻辑异或(XOR 运算 A)四种

    逻辑异或 指的是排斥相同数值的运算。“两个数值不同”
    图:
    在这里插入图片描述

    展开全文
  • 打印数据的二进制表示 分类: STL &算法分析 2012-03-08 11:06 494人阅读 评论(0) 收藏 举报 floatdate /*! \author Liubao \date 2011/4/4 \brief 打印数据的二进制形式 */ #include #include...

    打印数据的二进制表示

    分类: STL &算法分析 494人阅读 评论(0) 收藏 举报
    /*!
    \author Liubao
    \date 2011/4/4
    \brief 打印数据的二进制形式
    */
    #include <stdio.h>
    #include <stdlib.h>
    #include <limits.h>
     
    /*!
    打印字符的二进制表示,结尾不含换行符
    \param ch 需要打印的字符
    \warning 注意此处是宏实现,不可使用自增/自减运算符作参数!
    */
    #define _PRINT_CHAR(ch)                             \
        do                                              \
        {                                               \
            unsigned char mask = CHAR_MIN;              \
                                                        \
            do                                          \
                putchar((ch) & mask ? '1' : '0');       \
            while(mask >>= 1);                          \
        }while(0)
     
    /*!
    打印任意基本数据类型var的二进制表示,结尾不含换行符
    \param var 需要打印的变量
    \warning 由于针对小端类型特殊处理,打印非基本数据类型会导致结果错误!
    */
    #define PRINT_BINARY(var)                           \
        do                                              \
        {                                               \
            const char *begin = (const char *)&(var);   \
            const char *end = begin + sizeof(var);      \
                                                        \
            while(begin <= --end) _PRINT_CHAR(*end);    \
        }while(0)
     
    /*!
    打印任意基本任据类型var的二进制表示,结尾包含换行符
    \param var 需要打印的变量
    \warning 由于针对小端类型特殊处理,打印非基本数据类型会导致结果错误!
    */
    #define PUTS_BINARY(var) PRINT_BINARY(var); putchar('\n')
     
    int main()
    {
        double d = 5.66f;
        char ch = 'A';
        int i = -1;
        float f = 0.15625f;
        long long l = 1;
     
        PUTS_BINARY(d);
        PUTS_BINARY(ch);
        PUTS_BINARY(i);
        PUTS_BINARY(f);
        PRINT_BINARY(l);
     
        return 0;
    }
    展开全文
  • 位运算 其实这篇博客不是来讲位运算,但是涉及到二进制,就顺便讲一下。

    数据的二进制表示

    以下先以java中的byte类型为模板将(长度短,代码好写。。。)

    	byte b1 = (byte) 0b00000000;//0b表示后面的数据用二进制表示,0为八进制,0x为十六进制,十进制不带前缀
    	byte b2 = (byte) 0b10000000;
    	byte b3 = (byte) 0b11111111;
    	System.out.println(b1);
    	System.out.println(b2);
    	System.out.println(b3);
    	//以上的输出结果为0、-128、-1
    

    为何二进制与数据是这么对应的?个人理解是方便计算机进行运算。试想以下情况:
    有一个数x的值为-128,我们使x加一变为-127,如果-128的二进制表示为0b11111111,那么-127应当为0b11111110,虽然值+1,但是二进制表示却是-1,底层不符合逻辑。所以逻辑一点,表面上既然+1,那底层最好也+1,所以-128用0b10000000来表示更合理,-127则相应的为0b10000001,底层的确比-128大1。
    以这种方法表示,0b11111111则表示-1,而-1加一之后为0,二进制加一为0b100000000(8个0),因为byte长度为一个字节,即只有8bits,溢出的1被舍去,剩下为0b00000000,正好为0,符合-1+1=0。

    数据类型转换

    上面的东西看完之后,我们进入正题。
    之前我正在用java来实现通信,期间需要将各种数据与byte类型进行转换,而在将byte型转成int型数据时发现了一件事情。以如下代码为例:

    	byte b = (byte) 0xff;//即255
    	System.out.println(b);
    	System.out.println((int) b);
    	System.out.println(b & 0xff);
    	System.out.println((int) (b & 0xff));
    	System.out.println(b | 0x00);
    	System.out.println((int) (b | 0x00));
    

    三行输出分别为-1、-1、255、255、-1、-1
    真是一件很令人头疼的事
    我们先得出以下结论:

    1. 是否进行强制类型转换对结果没有影响
    2. byte型数据与0进行或("|")运算不会使输出结果发生改变(即以byte类型输出,值域为-128~127)
    3. byte型数据与0xff(相对于8bits的数据来说即各位全是1)进行与("&")运算,会以比byte值域更大的域来输出,输出的数据明显超过了byte的值域

    现在我们来看看下面这种情况:

    	byte b = (byte) 0xff;
    	int num = (int) b;
    	System.out.println(num );
    	System.out.println(num  & 0xff);
    	System.out.println(num  & 0xffff);
    	System.out.println(num  & 0xffffffff);
    	System.out.println(num  | 0x00);
    

    我们提前将byte类型转换成了int类型,输出结果如下:-1、255、65535、-1、-1
    显然,num的二进制表示为0b111111111111111111111111(32个1)
    我们又得出以下结论:

    1. byte型转换成int型时(可以拓展为短数据类型转换成长数据类型),会保持值不变(负数高位补1,正数高位补0)
    2. 与上面相反,将int型转换成byte型时(长变短),如果发生溢值,则会舍弃高位,保留低位

    以上就是我进行的全部测试
    但是这里还有一个问题没有解决,希望有大神能给我一些帮助:
    为什么b & 0xffb | 0x00的值不一样,理论上两者都不会使值发生变化

    至此,我想讲的就讲完了,谢谢大家的阅读。

    展开全文
  • 今天做位运算题目,想要通过查看二进制的表示形式来debug和分析 特此记录一下 c++ STL中模板类bitset简单实用 #Include 将整形int转化为二进制bitset() bitset(x)//将x转化为32位二进制数 测试代码 #include #...

    今天做位运算的题目,想要通过查看二进制的表示形式来debug和分析

    特此记录一下 c++ STL中模板类bitset的简单实用

    #Include<bitset>
    

    将整形int转化为二进制bitset<指定二进制位数>()

    bitset<32>(x)//将x转化为32位二进制数
    

    测试代码

    #include <iostream>
    #include <bitset>
    using namespace std;
    int main(){
    	int x=38^40;
    	cout<<bitset<sizeof(x)*8>(x)<<endl;//int占4字节,一个字节8位,最终输出的是32个0或1
    	cout<<bitset<8>(x)<<endl;//输出8位 
    	return 0;
    }
    

    测试结果
    在这里插入图片描述

    展开全文
  • 二进制表示 以12.123为例: 12/2 = 6---------------------0 6/2 = 3----------------------0 3/2 = 1----------------------1 1/2 = 0----------------------1 所以整数部分是1100 0.123*2 = 0.246...
  • 求一个数据,二进制表示中"1"个数

    千次阅读 2012-05-18 16:35:22
    算法:追求时间和空间最优    输入一个正整型变量,求其二进制表示中"1"个数 //Bit1Count #include /******************************************************... FileFunc : 求一个数据,二进制表示中"1"个数
  • 1. 在读取文件或内存时,有时候需要输出那段内存十六或二进制表示进行分析。 2. 标准printf没有显示二进制,而%x显示有最大上限,就是8字节,超过8字节就不行了。 test_binary_hex.cpp [cpp] ...
  • 负数的二进制表示

    2020-03-18 18:24:29
    计算机中,所有数据最终都是使用二进制数表达。 如何将一个10进制数如何转换为二进制数以及如何将如何将一个16进制数如何转换为二进制数,详见下图。 假设有一个 int 类型数,值为5,那么,我们知道它在...
  • 实现递归方法,使它返回数N的二进制表示中的1的个数。(如果N是奇数,那么N的二进制表示中的1的个数为N/2的二进制表示的1的个数加1)。实现见文章最后。  数据结构和算法(Java语言描述)的第一章课后题。 先简化...
  • 数据的二进制转换

    2018-12-03 21:53:21
    二进制表示法。。。。  这是也是基础知识啦:  别急我们一点一点讲解。正整数转二进制,负整数转二进制,小数转二进制    正整数转二进制: 正整数转成二进制。要点一定一定要记住哈:除二取余,然后倒序...
  • 编程一个java程序 可以对键盘录入字节型数据 进行10进制到二进制表示形式转换 (后期使用循环进行优化) nextByte(); 可以录入字节型数据 /** * 编程一个java程序 可以对键盘录入字节型数据 * 进行10进制到...
  • float数据对应的二进制表示

    千次阅读 2014-05-18 15:46:02
    #include "stdafx.h" #include using namespace std;; union data { int a; float b; }mm; int main(int argc, char* argv[]) { mm.b=1.0f;...即float类型的数据1.0在内存中的表示为:0x3f800000
  • 浮点数的二进制表示

    千次阅读 2017-12-14 22:50:31
    回想float和double类型数据内存分配情况时, 在阮一峰老师的网络日志中看到一篇关于浮点数的二进制表示的博文, 自己在IDEA上敲出Java代码后发现并没有取得原文的效果(Java对于内存的优化),所以原文转载好了#include ...
  • 场景: 1. 在读取文件或内存时,有时候输出那段内存十六或二进制表示进行分析。 2. 标准printf没有显示二进制,而%x显示有最大上限,就是8字节,超过8字节就不行了。
  • 我们一般使用的是十进制数,但是计算机只能识别二进制数,且只能操作二进制数,但是数据的进制还存在八进制和十六进制,而且不同进制的数据都存在着不同的表示。 其中八进制的数据以0开头,十六进制的数据以0x开头...
  • 鸽了一个多月,感谢各位朋友没取关(我真不是在提醒各位取关-_-||),等忙完这段,希望自己也能做一个日更博主2333在冯诺依曼体系计算机中,有一个十分重要特性——指令和数据均以二进制的形式表示以及存储。...
  • -1的二进制表示

    万次阅读 2017-02-15 20:26:02
    我们已经知道计算机中,所有数据最终都是使用二进制数表达。 我们也已经学会如何将一个10进制数如何转换为二进制数。 不过,我们仍然没有学习一个负数如何用二进制表达。   比如,假设有一 int 类型数,值为5,...
  • 意思是把一个带符号的二进制 转化为对应的十进制,比如这个二进制首位是1,那么转化过来的10进制是个负数,这个二进制数是用一个10进制来表示的。应该自己不会看晕了吧。代码是复制别人的,谢谢那位同学,转载了一下...
  • 浮点数的二进制表示(IEEE 754标准)

    万次阅读 多人点赞 2017-04-19 12:55:59
    浮点数是我们在程序里常用的数据类型,它在内存中到底是怎么样形式存在,是我了解之前是觉得好神奇,以此记录,作为学习笔记。 现代计算机中,一般都以IEEE 754标准存储浮点数,这个标准在内存中存储形式为:...
  • 题目来源“数据结构与...问题分析:本题涉及到二进制的处理,在本题使用到&amp;操作和&gt;&gt;操作。 方法: int get_num(int n){ int num = 0; if (n &lt; 0){ num += 1; n = n * (-1); ...
  • 输出二进制表示

    2020-03-01 17:52:57
     输入[-128,127]内整数,输出其二进制表示。提示,可使用按位与& 输入格式  例:7 输出格式  例:00000111 样例输入 一个满足题目要求输入范例。 例: 7 样例输出 与上面样例输入对应输出。 例: ...
  • #include<stdio.h> int main(void){ int a=1234; printf("%#o %#X\n",a,a); return 0; }

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 17,247
精华内容 6,898
关键字:

数据的二进制表示