二进制代码

LeetCode 腾讯精选50题--2的幂

喜你入骨 提交于 2019-11-27 03:29:41
在二进制中,2的幂的数字用二进制表示时只会有一位表示为1,其余都为0,基于这个前提,可以有两种方案:   1. 做位移操作   2. 与数值取反并与原数值做与操作,判断是否与原来的数值相同 对于方案1,我的想法是对数值 n 先做一次右移的移位操作,然后在对右移后的数做左移操作,判断两次操作前后的数值是否相同,以下是代码: 1 public boolean isPowerOfTwo(int n) { 2 3 for(int i=0;i<32;i++){ 4 int temp = n >> i; 5 int large = temp << i; 6 if(n != large){ 7 return false; 8 } 9 if(temp == 1){ 10 return true; 11 } 12 } 13 return false; 14 } 对于方案2,就很简单了,做与操作就可以了,由于计算机中负数的二进制表示是先对正数按位取反,然后再加1实现的,所以对于 n & -n 如果n是2的幂,二进制表示中只有一位为1,设位置为k,-n 这是从低位开始,直到k之前的都是0,k之后的都为1,与操作后还是 n 1 public boolean isPowerOfTwo2(int n){ 2 3 return (n > 0) && ((n & (-n)) == n); 4 } 来源:

VC++ 字符串操作学习总结

北慕城南 提交于 2019-11-27 03:01:36
vc++中各种字符串(转载) http://www.cnblogs.com/tomin/archive/2008/12/28/1364097.html CString ,BSTR ,LPCTSTR之间关系和区别 CString是一个动态TCHAR数组,BSTR是一种专有格式的字符串(需要用系统提供的函数来操纵,LPCTSTR只是一个常 量的TCHAR指针。 CString 是一个完全独立的类,动态的TCHAR数组,封装了 + 等操作符和字符串操作方法。 typedef OLECHAR FAR* BSTR; typedef const char * LPCTSTR; vc++中各种字符串的表示法 首先char* 是指向ANSI字符数组的指针,其中每个字符占据8位(有效数据是除掉最高位的其他7位),这里保持了与传 统的C,C++的兼容。 LP的含义是长指针(long pointer)。LPSTR是一个指向以‘\0’结尾的ANSI字符数组的指针,与char*可以互换使用,在 win32中较多地使用LPSTR。 而LPCSTR中增加的‘C’的含义是“CONSTANT”(常量),表明这种数据类型的实例不能被使用它的API函数改变, 除此之外,它与LPSTR是等同的。 1.LP表示长指针,在win16下有长指针(LP)和短指针(P)的区别,而在win32下是没有区别的,都是32位

Flink 源码解析 —— 深度解析 Flink 是如何管理好内存的?

时间秒杀一切 提交于 2019-11-27 02:10:25
前言 如今,许多用于分析大型数据集的开源系统都是用 Java 或者是基于 JVM 的编程语言实现的。最着名的例子是 Apache Hadoop,还有较新的框架,如 Apache Spark、Apache Drill、Apache Flink。基于 JVM 的数据分析引擎面临的一个常见挑战就是如何在内存中存储大量的数据(包括缓存和高效处理)。合理的管理好 JVM 内存可以将 难以配置且不可预测的系统 与 少量配置且稳定运行的系统区分开来。 在这篇文章中,我们将讨论 Apache Flink 如何管理内存,讨论其自定义序列化与反序列化机制,以及它是如何操作二进制数据的。 数据对象直接放在堆内存中 在 JVM 中处理大量数据最直接的方式就是将这些数据做为对象存储在堆内存中,然后直接在内存中操作这些数据,如果想进行排序则就是对对象列表进行排序。然而这种方法有一些明显的缺点,首先,在频繁的创建和销毁大量对象的时候,监视和控制堆内存的使用并不是一件很简单的事情。如果对象分配过多的话,那么会导致内存过度使用,从而触发 OutOfMemoryError,导致 JVM 进程直接被杀死。另一个方面就是因为这些对象大都是生存在新生代,当 JVM 进行垃圾回收时,垃圾收集的开销很容易达到 50% 甚至更多。最后就是 Java 对象具有一定的空间开销(具体取决于 JVM 和平台)。对于具有许多小对象的数据集

浮点数精度

℡╲_俬逩灬. 提交于 2019-11-27 01:13:04
1、为什么叫浮点数? 相对于浮点数,就是固点数,小数点固定在最右边,也就是整数。浮点数的小数点,根据指数的取值,左右移动。 2、考虑二进制整数,假设只有2个bit,可以表示00,01,10,11,共四个整数,表示范围是[0,3],可以表示这个范围内的所有整数。 3、考虑二进制小数,假设只有2个bit,可以表示多少个小数? 答案也是四个。假设小数点在最左边,分别为00,01,10,11,表示的值分别为0.0,0.25,0.50,0.75。表示范围[0.0,0.75],特别注意:不同于整数,整数可以表示范围内的每一个整数,如[0,3]。而小数只能表示[0.0, 0.75]范围内的四个小数,我们知道从0.0到0.75有无数个小数,两位二进制只能表示其中的4个。 4、十进制0.0到0.9,有几个可以使用二进制表示? 只有两个,0.0和0.5。考虑十进制,小数第一位是1/10,小数第二位是1/100,小数第三位是1/1000,那么二进制呢? 小数第一位是1/2,小数第二位是1/4,小数第三位是1/8,那么0.1 可以使用下面的方式表示吗? a1*1/2 + a2*1/4 + a3*1/8 + .... 存在这样的a1,a2,a3吗? 答案是不存在。 5、0.1+0.2 为什么不等于0.3?而是0.30000000000000004 在计算的时候,计算机要把0.1和0.2转化为二进制表示

字符编码笔记:ASCII,Unicode和UTF-8 (转)

隐身守侯 提交于 2019-11-27 00:21:06
转自 http://www.ruanyifeng.com/blog/2007/10/ascii_unicode_and_utf-8.html 今天中午,我突然想搞清楚Unicode和UTF-8之间的关系,于是就开始在网上 查资料。 结果,这个问题比我想象的复杂,从午饭后一直看到晚上9点,才算初步搞清楚。 下面就是我的笔记,主要用来整理自己的思路。但是,我尽量试图写得通俗易懂,希望能对其他朋友有用。毕竟,字符编码是计算机技术的基石,想要熟练使 用计算机,就必须懂得一点字符编码的知识。 1. ASCII码 我们知道,在计算机内部,所有的信息最终都表示为一个二进制的字符串。每一个二进制位(bit)有0和1两种状态,因此八个二进制位就可以组合出 256种状态,这被称为一个字节(byte)。也就是说,一个字节一共可以用来表示256种不同的状态,每一个状态对应一个符号,就是256个符号,从 0000000到11111111。 上个世纪60年代,美国制定了一套字符编码,对英语字符与二进制位之间的关系,做了统一规定。这被称为ASCII码,一直沿用至今。 ASCII码一共规定了128个字符的编码,比如空格“SPACE”是32(二进制00100000),大写的字母A是65(二进制 01000001)。这128个符号(包括32个不能打印出来的控制符号),只占用了一个字节的后面7位

linux 二进制安装mysql

只谈情不闲聊 提交于 2019-11-26 21:48:46
mysql安装为什么大部分使用二进制安装。而不是源码手动去编译? mysql使用的glibc进行开发的。glibc库是一个底层api,所以只要是linux,都会有glibc库。所以,mysql安装不需要考虑环境是否符合要求。移植性很方便。直接将编译好的二进制代码复制到另外一个机器上,也是可以用的。 原理性东西:一般在linux下安装一个软件,不同软件所需要的函数库不同。于是会遇到一个现象:一个软件复制到另外一个平台可能无法运行。安装软件需要先侦测环境就是出于此考虑。因为mysql使用的是通用的glibc函数库。没有对其他东西的依赖性。所以,从一个平台复制到另外一个平台能够通用。并不需要去侦测环境。直接使用编译好的二进制即可 手动编译安装,显得步骤麻烦。基于mysql的特点,二进制安装完全可以。 注:mysql5.5安装的时候,需要用到cmake命令,所以需要保证你的机器上安装了该命令。没有的话,还要去安装该cmake。也显得麻烦。我暂时不想去安装最新版本的了。 如果使用二进制安装升级怎么进行? 升级获取的还是二进制压缩包。那么,直接将指向目录切换到新的目录即可。 不需要涉及到像php一样,手动编译可以达到自己定制模块的好处。而mysql安装的时候不需要涉及到模块 mysql官方建议安装方式:二进制安装。 实践过程 大致思路就是:解压二进制文件放到指定的目录。然后安装基本的数据库

<剑指offer> 第8题

拥有回忆 提交于 2019-11-26 15:57:31
题目: 实现一个函数:输入一个整数,输出该二进制表示中1的个数。例如9表示成二进制1001,有2位1。输入9,输出2 (>>>表示不带符号向右移动二进制数,移动后前面统统补0;两个箭头表示带符号移动) 思路: 1.位移+计数,每次右移一位,不断和1进行与运算,直到位0 (JAVA语言规范中,int整型占四个字节,总计32位) 2.循环让(n - 1)& n 如果n的二进制中有k个1,那么这个方法只需要循环k次即可。原理是不断清除n的二进制表示中最右边的1,同时累加计数器,直至n为0。 因为从二进制的角度讲,n相当于在n-1的最低位加上1。 8(1000) = 7(0111)+ 1(0001) 8(1000)& 7(0111)= 0 (0000)清除了8最右边的1,8的二进制中只有一个1 7(01111)= 6(0110)+ 1(0001) 7(0111)& 6(0110)= 6(0110)清除了7最右边的1 循环k次至n=0 代码实现: public class Eighth { public static int countNumberOfOne1(int n){ int result = 0; for(int i = 0; i < 32; i ++){ result += (n & 1); n >>>= 1; } return result; } public static

JVM实战---类加载的过程

只谈情不闲聊 提交于 2019-11-26 15:01:22
任何程序都需要加载到内存才能与CPU进行交流 同理, 字节码.class文件同样需要加载到内存中,才可以实例化类 ClassLoader 的使命就是提前加载.class 类文件到内存中 在加载类时,使用的是Parents Delegation Model(溯源委派加载模型) Java的类加载器是一个运行时核心基础设施模块,主要是在启动之初进行类的加载、链接、初始化 第一步,Load阶段 读取类文件产生二进制流,并转为特定数据结构,初步校验cafe babe魔法数、常量池、文件长度、是否有父类等,然后创建对应类的java.lang.Class实例 第二步,Link阶段 包括验证、准备、解析三个步骤 验证是更详细的校验,比如final是否合规、类型是否正确、静态变量是否合理等 准备阶段是为静态变量分配内存,并设定默认值,解析类和方法确保类与类之间的相互引用正确性,完成内存结构布局 第三步,Init 阶段 执行类构造器 方法,如果赋值运算是通过其他类的静态方法来完成的,那么会马上解析另外一个类,在虚拟机栈中执行完毕后通过返回值进行赋值 类加载是一个将.class字节码文件实例化成Class对象并进行相关初始化的过程。 在这个过程中,JVM会初始化继承树上还没有被初始化过的所有父类,并且会执行这个链路上所有未执行过的静态代码块、静态变量赋值语句等。 某些类在使用时

二进制、编码

試著忘記壹切 提交于 2019-11-26 14:23:22
二进制:   n位最大表示数值之和:2**n-1,n位表示数值:2**(n-1) 计算机容量:   二进制1位=1bit   1byte=8bit   1kb=1024byte   1mb=1024kb 编码   编码是信息从一种形式或格式转换为另一种形式的过程,也称为计算机编程语言的代码简称编码。用预先规定的方法将文字、数字或其它对象编成数码,或将信息、数据转换成规定的电脉冲信号。编码在电子计算机、电视、遥控和通讯等方面广泛使用。编码是信息从一种形式或格式转换为另一种形式的过程。解码,是编码的逆过程。 ASCII码:ASCII 码使用指定的7 位或8 位二进制数组合来表示128 或256 种可能的字符,每个字符由8bit来存储。 来源: https://www.cnblogs.com/zzzhao/p/11323849.html

计算机组成原理题库(唐朔飞)

醉酒当歌 提交于 2019-11-26 12:27:42
计算机组成原理题库 ~~02|01|1|2|A0400047_010_1|871 ^^通常划分计算机发展时代是以( )为标准的。 A、所用电子器件 B、运算速度 C、计算机结构 D、所用语言 ^^A ~~02|01|1|2|A0400047_010_2|872 ^^能够被计算机硬件直接识别的语言是( )。 A、符号语言 B、机器语言 C、汇编语言 D、机器语言和汇编语言 ^^B ~~02|01|1|2|A0400047_010_3|873 ^^计算机能直接执行的程序是( )。 A、命令文件 B、汇编程序 C、机器语言程序 D、源程序 ^^C ~~02|01|1|2|A0400047_010_4|874 ^^计算机内的信息都是以( )形式表示的。 A、BCD码 B、二进制码 C、字母码 D、符号码 ^^B ~~02|01|1|2|A0400047_010_5|875 ^^至今为止,计算机中的所有信息仍以二进制方式表示,其理由是( )。 A、节省物理器件 B、运算速度快 C、物理器件容易实现 D、信息处理方便 ^^C ~~02|01|1|2|A0400047_010_6|876 ^^电子计算机技术在半个世纪中虽有很大进步,但至今其运行仍遵循着一位科学家提出的基本原理。他就是( )。 A、牛顿 B、爱因斯坦 C、爱迪生 D、冯·诺依曼 ^^D ~~02|01|1|2|A0400047