二进制代码

二进制数据的序列化反序列化和Json的序列化反序列化的重要区别

匆匆过客 提交于 2020-03-01 09:32:03
原文: 二进制数据的序列化反序列化和Json的序列化反序列化的重要区别   前言:最近一个一个很奇怪的问题,很明白的说,就是没看懂,参照下面的代码: /// <summary> /// 反序列化对象 /// </summary> /// <typeparam name="T">指定对象类型</typeparam> /// <param name="data">字节数组</param> /// <param name="isClearData">压缩完成后,是否清除待压缩字节数组里面的内容</param> /// <returns>指定类型的对象</returns> public static T DeserializeByBytes<T>(byte[] data, bool isClearData = true) { T t = default(T); if (data == null) return t; try { BinaryFormatter formatter = new BinaryFormatter(); using (MemoryStream ms = new MemoryStream(data)) { t = (T)formatter.Deserialize(ms); } formatter = null; if (isClearData) Array.Clear

数学问题 | 十进制与二进制

孤街醉人 提交于 2020-02-29 15:57:04
题目描述: 对于一个十进制数A,将A转换为二进制数,然后按位逆序列排列,再转换为十进制数B,B即为A的二进制逆序数。例如,对于十进制数173,其二进制形式为10101101,逆序排列得到10110101,其十进制数为181,181即为173的二进制逆序数。 输入: 一个1000位(即10E999)以内的十进制数 输出: 输入的十进制数的二进制逆序数 测试样例: 输入: 173 输出: 181 C++代码: # include <iostream> # include <cstdio> # include <string> # include <vector> using namespace std ; string Divide ( string str , int x ) //字符串除法。 字符串 str 除以 x 后,返回所得字符串 { int remainder = 0 ; //保留余数 for ( int i = 0 ; i < str . size ( ) ; i ++ ) { int current = remainder * 10 + str [ i ] - '0' ; str [ i ] = current / x + '0' ; remainder = current % x ; } int pos = 0 ; while ( str [ pos ] == '0'

力扣(C++):二进制求和

给你一囗甜甜゛ 提交于 2020-02-28 22:25:06
题目描述 给定两个二进制字符串,返回他们的和(用二进制表示)。 输入为非空字符串且只包含数字 1 和 0。 示例 1: 输入: a = “11”, b = “1” 输出: “100” 示例 2: 输入: a = “1010”, b = “1011” 输出: “10101” 来源:力扣(LeetCode) 链接: 二进制求和 代码示例: class Solution { public: string addBinary(string a, string b) { int lenA = a.size(); int lenB = b.size(); //先让两个字符串等长 while (lenA < lenB) { a = '0' + a; ++lenA; } while (lenA > lenB) { b = '0' + b; ++lenB; } //满2进1 for (int i = lenA - 1; i > 0; --i) { a[i] = a[i] - '0' + b[i]; if (a[i] >= '2') { a[i] = (a[i] - '0') % 2 + '0'; a[i - 1] = a[i - 1] + 1; } } //判断首位 a[0] = a[0] - '0' + b[0]; if (a[0] >= '2') { a[0] = (a[0] - '0') %

给定一个正整数,找出与其二进制表示中1的个数相同,且大小最接近的那两个数

筅森魡賤 提交于 2020-02-28 14:20:58
/** * 功能:给定一个正整数,找出与其二进制表示中1的个数相同,且大小最接近的那两个数。 * (一个略大一个略小。) */ 三种方法: 方法一:蛮力法 方法二:位操作法 [java] view plain copy <span style="white-space:pre"> </span>/** * 方法:位操作法 * 思路:获取后一个较大的数 * 1)计算c0和c1。c1是拖尾1的个数,c0是紧邻拖尾1的作坊一连串0的个数。 * 2)将最右边、非拖尾0变为1,其位置为p=c1+c0。 * 3)将位p右边的所有位清零。 * 4)在紧邻位置p的右方,插入c1-1个1。 * @param n * @return */ public static int getNext(int n){ int c=n; int c0=0; int c1=0; while((c&1)==0&&(c!=0)){ c0++; c>>=1; } while((c&1)==1){ c1++; c>>=1; } if(c0+c1==31||c0+c1==0)//c0+c1+1=32,1表示p所在位。 return -1; int p=c0+c1;//最右边处,非拖尾0的位置。 n|=(1<<p);//翻转0为1 n&=~((1<<p)-1);//将p右边的所有位清零 n|=(1<<(c1-1))-1;/

理解有符号数和无符号数

陌路散爱 提交于 2020-02-28 04:10:10
http://www.cnblogs.com/lazycoding/archive/2011/03/21/unsigned-signed.html 声明网上看到的文章,原文找不到了,原文被转载的不成样子,重复很多,整理花了很长时间,在翻看了维基百科后发现,原文中对于负数原码和补码存在一些问题,修改了一部分,原作者看到后可以联系我。 1、你自已决定是否需要有正负。 就像我们必须决定某个量使用整数还是实数,使用多大的范围数一样,我们必须自已决定某个量是否需要正负。如果这个量不会有负值,那么我们可以定它为带正负的类型。 在计算机中,可以区分正负的类型,称为有符类型(signed),无正负的类型(只有正值),称为无符类型。 (unsigned)数值类型分为整型或实型,其中整型又分为无符类型或有符类型,而实型则只有符类型。 字符类型也分为有符和无符类型。 比如有两个量,年龄和库存,我们可以定前者为无符的字符类型,后者定为有符的整数类型。 2、使用二制数中的最高位表示正负。 首先得知道最高位是哪一位?1个字节的类型,如字符类型,最高位是第7位,2个字节的数,最高位是第15位,4个字节的数,最高位是第31位。不同长度的数值类型,其最高位也就不同,但总是最左边的那位(如下示意)。字符类型固定是1个字节,所以最高位总是第7位。 (红色为最高位) 单字节数: 11111111 双字节数:

【组成原理】概述

梦想与她 提交于 2020-02-28 04:05:37
目录 计算机概述 数据 总线 CPU 存储器 输入/输出设备 计算机的时标系统 计算机概述 计算机的基本组成: 存储器 :     实现 记忆功能 的部件用来存放计算程序及参与运算的各种数据 运算器 :     负责数据的 算术运算和逻辑运算 即数据的加工处理 控制器 :     负责对程序规定的 控制信息 进行分析,控制并协调输入,输出操作或内存访问 输入设备 :    实现 计算程序和原始数据 的输入 输出设备 :    实现 计算结果 输出 组成的联系: 图一 图二 计算机的工作过程: 用户 打开程序 系统把程序 代码段和数据段 送入计算机的内存 控制器从存储器中 取指令 控制器分析, 执行指令 ,为取下一条指令做准备 取下一条指令 ,分析执行,如此重复操作,直至执行完程序中全部指令,便可获得全部指令 冯·诺依曼机制: 程序存储 采用 2进制 计算机系统的体系结构: 图一: 图二 数据概述 数据信息的两种基本方法: 按值 表示 :  要求在选定的进位制中正确表示出数值,包括数字符号,小数点正负号 按形 表示 :  按一定的 编码方法 表示数据 信息的存储单位: 1KB=2^10B=1024 Byte 1MB=2^20B=1024 KB 1GB=2^30B=1024 MB 1TB=2^40B=1024 GB 浮点表示法: 公式 :  N=2^(+-e)*(+-s) 说明 :

部分和问题(挑战程序设计竞赛)

ⅰ亾dé卋堺 提交于 2020-02-28 03:49:43
问题描述: 给定一个整数K和一个整数数列a1,a2,…,an,判断是否可以从中选出若干个数,使得它们的和恰好为K。 样例: 输入: n=4 a={1,2,4,7} K=13 输出: Yes(13 = 2 + 4 + 7) 解法一:   这题可以套用生成子集的模板,求出这个整数数列的所有子集,去判断每一个子集是否满足条件。我们可以利用二进制求解,将数组中的n个元素对应n位的二进制。其中每一个元素对应一个二进制位。那么从0到2的n次方减一的每一个数就可以对应一个子集。也就是说所有子集一共有2的n次方个。(这里要注意测试数据的范围,要注意所有子集数有没有超出int) 代码如下: import java . util . * ; public class 部分和 { public static void main ( String [ ] args ) { Scanner scanner = new Scanner ( System . in ) ; int n = scanner . nextInt ( ) ; int [ ] arr = new int [ n ] ; for ( int i = 0 ; i < n ; i ++ ) { arr [ i ] = scanner . nextInt ( ) ; } int k = scanner . nextInt ( ) ; if (

C# xml序列化 二进制序列化 unity中的asset序列化

十年热恋 提交于 2020-02-27 09:31:33
序列化是将对象保存为xml或json或二进制文件; 反序列化则是读取文件信息,还原为对象; 先建一个存储数据的类,添加标签表示可序列化 using System.Collections; using System.Collections.Generic; using UnityEngine; using System.Xml.Serialization; [System.Serializable] public class XmlTest { [XmlAttribute("Id")] public int Id { get; set; } [XmlAttribute("Name")] public string Name { get; set; } [XmlElement("List")] public List<int> List { get; set; } } xml序列化和二进制序列化 using System.Collections; using System.Collections.Generic; using UnityEngine; using System.IO; using System.Xml.Serialization; using System.Runtime.Serialization.Formatters.Binary; public class

Beetle在TCP通讯中使用二进制序列化对象传输

筅森魡賤 提交于 2020-02-26 02:10:00
组件发送的对象都必须实现IMessage接口,通过实现接口来描述一个对象的序列化过程;自定义读写流的好处就是可以得到更好的性能,但缺点也相对明显的就是工作量比较多.在很多应用场合下所追求的并不是性能第一,而是希望省下这些烦锁的工作,为了应付这种需要组件可以实现一个简单的消息适配器来完成这样的功能.下面通过扩展的方式来实现组件对.net二进制序列化对象转输的支持. 定义协议格式 在TCP下进行数据交互通讯首先是要制定一个通讯的应用协议,由于组件提供基于结束符和头大小描述的基础分析器,可以从这基础分析协中派生下来.似下通过一个图来描述协议的具体细节 协议描述比较简单消息头是4个字节用于存储消息的总长度,而序列化存储的数据则是总长度减去头4位. 实现具体的分析器和消息适配器 协议制定后就可以进行分析器的实现,由于采用头4字节描述大小,所以分析器从HeadSizeOfPackage基础类派生下载重写相关方法即可;完整实现代码如下: public class BinaryFormatterPackage:HeadSizeOfPackage { public BinaryFormatterPackage() { } public BinaryFormatterPackage(TcpChannel channel) : base(channel) { } public override

手把手,嘴对嘴,讲解UCOSII嵌入式操作系统的任务调度策略(二)

北城以北 提交于 2020-02-25 20:07:21
继续…… if (ticks > 0u) { /* 延时参数是否为0 */ OS_ENTER_CRITICAL();            /* 禁止中断 */ y = OSTCBCur->OSTCBY; OSRdyTbl[y] &= (OS_PRIO)~OSTCBCur->OSTCBBitX; if (OSRdyTbl[y] == 0u) { OSRdyGrp &= (OS_PRIO)~OSTCBCur->OSTCBBitY; } OSTCBCur->OSTCBDly = ticks; OS_EXIT_CRITICAL();           /* 开启中断 */ OS_Sched(); } 在上一段代码中,出现了一个陌生的数组: OSRdyTbl[],跟踪这个变量可以找到它的定义,发现它仅仅是一个uint8型的数组,长度是8个。 可以明确的告诉大家,这个数组很重要,应该算是任务优先级调度核心参数之一,与下面那个参数OSRdyGrp 合起来便可以作为任务就绪表。 ※接下来需要讲UCOSII系统的任务优先级调度策略,这一段有些复杂,需要反复思考,查阅大量的资料。 UCOSII的优先级策略 UCOSII操作系统最大可以管理64个任务(255个的暂时不讨论),每个任务都有唯一的优先级,从0开始到64,数字越小优先级越高,越优先进行系统调用,为了方面管理和调度