二进制代码

【剑指offer】二进制中1的个数

淺唱寂寞╮ 提交于 2019-12-14 22:09:12
这个题的思路是比较简单的 大家先想一下,一个十进制整数是如何转化为二进制数的??? 我们采用的是“除2取余,逆序排列"法。具体做法是:用2整除十进制整数,可以得到一个商和余数;再用2去除商,又会得到一个商和余数,如此进行,直到商为小于1时为止,然后把先得到的余数作为二进制数的低位有效位,后得到的余数作为二进制数的高位有效位,依次排列起来。 所以这个思路就是:和2%,看是否为1,为1,结果加1,否则继续 但是我们需要思考一下代码如何优化的问题? 如二进制是100000000000000000000,那我们需要的循环次数是多少,这个时间复杂太高,我们需要优化 所以一下均为优化过的方法 Java 1、 public class Solution { public int NumberOf1 ( int n ) { int res = 0 ; while ( n != 0 ) { n &= ( n - 1 ) ; //我将这个方法称为抹0法,将最右边的1抹掉, res ++ ; } return res ; } } 2、 public class Solution { public int NumberOf1 ( int n ) { int res = 0 ; while ( n != 0 ) { n -= n & ( ~ n + 1 ) ; //这对与方法1相似,都是将最右侧的1抹掉

HTTP基础原理与koa-bodyparser原理解析

戏子无情 提交于 2019-12-14 21:48:52
一、前置知识   在理解koa-bodyparser原理之前,首先需要了解部分HTTP相关的知识。 1、报文主体   HTTP报文主要分为请求报文和响应报文,koa-bodyparser主要针对请求报文的处理。   请求报文主要由以下三个部分组成: 报文头部 空行 报文主体   而koa-bodyparser中的body指的就是请求报文中的报文主体部分。 2、服务器端获取报文主体流程   HTTP底层采用TCP提供可靠的字节流服务,简单而言就是报文主体部分会被转化为二进制数据在网络中传输,所以服务器端首先需要拿到二进制流数据。   谈到网络传输,当然会涉及到传输速度的优化,而其中一种优化方式就是对内容进行压缩编码,常用的压缩编码方式有: gzip compress deflate identity(不执行压缩或不会变化的默认编码格式)   服务器端会根据报文头部信息中的Content-Encoding确认采用何种解压编码。   接下来就需要将二进制数据转换为相应的字符,而字符也有不同的字符编码方式,例如对于中文字符处理差异巨大的UTF-8和GBK,UTF-8编码汉字通常需要三个字节,而GBK只需要两个字节。所以还需要在请求报文的头部信息中设置Content-Type使用的字符编码信息(默认情况下采用的是UTF-8),这样服务器端就可以利用相应的字符规则进行解码,得到正确的字符串。

LeetCode67. 二进制求和

那年仲夏 提交于 2019-12-14 04:29:39
LeetCode67. 二进制求和 1.题目 给定两个二进制字符串,返回他们的和(用二进制表示)。 输入为非空字符串且只包含数字 1 和 0。 2.示例 示例 1: 输入: a = "11", b = "1" 输出: "100" 示例 2: 输入: a = "1010", b = "1011" 输出: "10101" 3.思路 ①:使用字符方法来解决 ②:处理成整数来解决 4.代码 class Solution ( object ) : """ leetcode答案的代码copy过来的,没有去对齐就解决完问题,思路还是挺好的 """ def addBinary ( self , a , b ) : """ :type a: str :type b: str :rtype: str """ ans , extra = '' , 0 i , j = len ( a ) - 1 , len ( b ) - 1 while i >= 0 or j >= 0 : if i >= 0 : extra += ord ( a [ i ] ) - ord ( '0' ) if j >= 0 : extra += ord ( b [ j ] ) - ord ( '0' ) ans += str ( extra % 2 ) extra //= 2 i , j = i - 1 , j - 1 if

linux系统mysql主从配置

蹲街弑〆低调 提交于 2019-12-13 07:39:58
##linux系统mysql主从配置 mysql主从配置的流程大体如图: 1)master会将变动记录到二进制日志里面; 2)master有一个I/O线程将二进制日志发送到slave; slave有一个I/O线程把master发送的二进制写入到relay日志里面; 4)slave有一个SQL线程,按照relay日志处理slave的数据; 二、操作步骤 按照原理,我们开启mysql主从复制,我们大体需要做以下操作: 1)开启master的二进制日志 2)开启slave的二进制日志 3)将slave指向master 4)开始复制 三、开启master二进制日志 1)编辑mysql的配置文件,使用命令: vim /etc/my.cnf 2)添加二进制日志配置,开启二进制(master-bin只是日志文件名称,可以自己指定) log-bin=master-bin server-id=1 注意:server-id是要指定的,不然会报错,每一台指定一个唯一标识符 四、授权 我们需要给slave配置一个用户/密码的权限 mysql>GRANT REPLICATION SLAVE ON . TO ‘用户名’@‘slave数据库的IP地址’ IDENTIFIED BY ‘密码’; 这行命令的意思是:允许在某个IP地址的某个用户以某个密码对当前数据库的所有库和所有表进行复制操作 注意:以上配置了权限

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

匆匆过客 提交于 2019-12-12 23:35:59
继续...... 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,数字越小优先级越高,越优先进行系统调用,为了方面管理和调度

SQL server的字段类型详解

泪湿孤枕 提交于 2019-12-12 18:02:34
SQL server的字段类型详解 bit 整型 bit数据类型是整型,其值只能是0、1或空值。这种数据类型用于存储只有两种可能值的数据,如Yes 或No、True 或False 、On 或Off. 注意:很省空间的一种数据类型,如果能够满足需求应该尽量多用。 tinyint 整型 tinyint 数据类型能存储从0到255 之间的整数。它在你只打算存储有限数目的数值时很有用。这种数据类型在数据库中占用1 个字节. 注意:如果bit类型太单调不能满足您的需求,您可以考虑用tinyint类型,因为这个类型相对也是比较安全的,不接受恶意脚本内容的嵌入。 smallint 整型 smallint 数据类型可以存储从- 2的15次幂(-32768)到2的15次幂(32767)之间的整数。这种数据类型对存储一些常限定在特定范围内的数值型数据非常有用。这种数据类型在数据库里占用2 字节空间. 注意:如果tinyint类型太单调不能满足您的需求,您可以考虑用smallint类型,因为这个类型相对也是比较安全的,不接受恶意脚本内容的嵌入。 int 整型 int 数据类型可以存储从- 2的31次幂(-2147483648)到2的31次幂 (2147483 647)之间的整数。存储到数据库的几乎所有数值型的数据都可以用这种数据类型。这种数据类型在数据库里占用4个字节. 注意

2019-12-12 Java关键字、标识符、注释、常量和进制问题、变量和数据类型

空扰寡人 提交于 2019-12-12 01:16:04
1:关键字 (1)被Java语言赋予特定含义的单词 (2)特点: 全部小写。 (3)注意事项: A:goto和const作为保留字存在。 B:类似于Notepad++这样的高级记事本会对关键字有特殊颜色标记 2:标识符 (1)就是给类,接口,方法,变量等起名字的字符序列 (2)组成规则: A:英文大小写字母 B:数字 C:$和_ (3)注意事项: A:不能以数字开头 B:不能是java中的关键字 C:区分大小写 (4)常见的命名规则(见名知意) A:包 其实就是文件夹,用于把相同的类名进行区分 全部小写 单级包:小写 举例:liuyi,com 多级包:小写,并用.隔开 举例:cn.itcast,com.baidu B:类或者接口 一个单词:首字母大写 举例:Student,Demo 多个单词:每个单词首字母大写 举例:HelloWorld,StudentName C:方法或者变量 一个单词:首字母小写 举例:name,main 多个单词:从第二个单词开始,每个单词首字母大写 举例:studentAge,showAllNames() D:常量 全部大写 一个单词:大写 举例:PI 多个单词:大写,并用_隔开 举例:STUDENT_MAX_AGE 3:注释 (1)就是对程序进行解释说明的文字 (2)分类: A:单行注释 // B:多行注释 /**/ C:文档注释(后面讲) /** */

&(与运算)、|(或运算)、^(异或运算)的本质理解

我怕爱的太早我们不能终老 提交于 2019-12-11 23:44:28
按位与运算符(&) 参加运算的两个数据,按二进制位进行“与”运算。 运算规则:0&0=0; 0&1=0; 1&0=0; 1&1=1; 即:两位同时为“1”,结果才为“1”,否则为0 例如:3&5 即 0000 0011& 0000 0101 = 00000001 因此,3&5的值得1。 另,负数按补码形式参加按位与运算。 “与运算”的特殊用途: (1)清零。如果想将一个单元清零,即使其全部二进制位为0,只要与一个各位都为零的数值相与,结果为零。 (2)取一个数中指定位 方法:找一个数,对应X要取的位,该数的对应位为1,其余位为零,此数与X进行“与运算”可以得到X中的指定位。 例:设X=10101110, 取X的低4位,用 X & 0000 1111 = 00001110 即可得到; 还可用来取X的2、4、6位。 按位或运算符(|) 参加运算的两个对象,按二进制位进行“或”运算。 运算规则:0|0=0; 0|1=1; 1|0=1; 1|1=1; 即 :参加运算的两个对象只要有一个为1,其值为1。 例如:3|5 即 00000011 | 0000 0101 = 00000111 因此,3|5的值得7。  另,负数按补码形式参加按位或运算。 “或运算”特殊作用: (1)常用来对一个数据的某些位置1。 方法:找到一个数,对应X要置1的位,该数的对应位为1,其余位为零

JDK中Integer.bitCount解析

和自甴很熟 提交于 2019-12-11 20:17:40
使用过Redis的人可能知道,Redis中给我们提供了统计二进制位数为1的位数量的指令 bitcout ,JDK中Integer类同样也给我们提供了该功能的方法 Integer.bigCount ,得益于此,我们很容易就能一窥该方法的实现 public static int bitCount(int i) { // HD, Figure 5-2 i = i - ((i >>> 1) & 0x55555555); i = (i & 0x33333333) + ((i >>> 2) & 0x33333333); i = (i + (i >>> 4)) & 0x0f0f0f0f; i = i + (i >>> 8); i = i + (i >>> 16); return i & 0x3f; } 上述代码作为Integer类中比较有意思的一个方法,该方法利用了一个技巧:通过分割分配二进制位的方式,CPU可以实现一个指令同时计算多个数值。该方法的前四行都利用了该技巧。 NOTE:CPU要通过分配字节位的方式同时计算多个数值对,需要有一定的前提:由于每个数分配的字节位的长度有限,这就要求计算结果的二进制表示不能超出分配的位数。在当前问题上,显而易见是成立的:相加的两个数的最大值所占的二进制位数只有分配的二进制位的一半,结果值需要的二进制位必然不会超过分配的二进制位数。 案例解析

算法训练 二进制数数

烂漫一生 提交于 2019-12-10 10:18:59
问题描述   给定L,R。统计[L,R]区间内的所有数在二进制下包含的“1”的个数之和。   如5的二进制为101,包含2个“1”。 输入格式   第一行包含2个数L,R 输出格式   一个数S,表示[L,R]区间内的所有数在二进制下包含的“1”的个数之和。 样例输入 2 3 样例输出 3 数据规模和约定   L<=R<=100000; 代码如下: import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc=new Scanner(System.in); int n=sc.nextInt(); int m=sc.nextInt(); int d=n; int count=0; String a[]=new String[m-n+1]; for(;n<=m;n++){ a[n-d]=Integer.toBinaryString(n); char c[]=a[n-d].toCharArray(); for(int i1=0;i1<c.length;i1++) { if('1'==c[i1]) { count++; } } } System.out.println(count); } } 来源: CSDN 作者: Reing.2.0 链接: https: