二进制代码

leetcode 338. 比特位计数

回眸只為那壹抹淺笑 提交于 2019-11-28 11:51:38
给定一个非负整数 num。对于 0 ≤ i ≤ num 范围中的每个数字 i ,计算其二进制数中的 1 的数目并将它们作为数组返回。 示例 1: 输入: 2 输出: [0,1,1] 示例 2: 输入: 5 输出: [0,1,1,2,1,2] 进阶: 给出时间复杂度为O(n*sizeof(integer))的解答非常容易。但你可以在线性时间O(n)内用一趟扫描做到吗? 要求算法的空间复杂度为O(n)。 这道题大概思路是,如果要求i的二进制中1的个数,那么如果i是偶数,则和i/2二进制1的个数相等,因为就相当于向左移动一位,如果i是奇数,则相当于是 (i-1) 这个数的二进制的最后一位加1(这里i为奇数,那么i-1为偶数,最后一位为0,i相当于把i最后一个二进制变为1)。 class Solution { public : vector < int > countBits ( int num ) { vector < int > v ( num + 1 , 0 ) ; for ( int i = 1 ; i < num + 1 ; ++ i ) { v [ i ] = v [ i >> 1 ] + ( i % 2 ) ; } return v ; } } ; 顺便记一下,计算一个数字二进制中有多少个1的代码: # include <iostream> using namespace

数字位运算操作与算法简单示例

痴心易碎 提交于 2019-11-28 11:24:40
  我们对于位运算可能既陌生又熟悉。知道其运算方法运算过程,但不能运用好它。   首先,我们还是回顾一下Java中位运算都包含那些操作: 一、与运算(&)   运算法则:将二进制数进行按位与运算。0&0=0;0&1=0;1&1=1 ; 如:0011 & 0010 = 0010;   二、或运算(|)   运算法则:将二进制数进行按位或运算。0|0 =0;1|0 = 1; 1|1=1   如:0011 & 0010 = 0011;   三、异或运算(^)   运算法则:将二进制数进行按位异或。 0^0 = 0; 1^1=0;1^0=1;   如:0011 ^ 0010 = 0001;   四、非运算(~)   运算法则:将二进制数进行按位“取反”操作。 ~0 = 1;~1 = 0;   如:~0011 = 1100   五、左移(有符号左移,无符号左移)、右移   参考上一篇: https://www.cnblogs.com/funmans/p/11179189.html   第六条:“>>”、“>>>”、“<<”都是什么鬼?   首先 >> 、>>> 都是Java中的右移操作,“>>”是有符号右移,“>>>”是无符号右移。顾名思义,有符号须得在右移过程中保持符号,所以,有符号右移,若是正数则在高位补0,反之补1,无符号右移不管正负都补0. 特别注意点:对于char、byte

【例题】64位整数乘法

筅森魡賤 提交于 2019-11-28 11:20:43
题目地址 方法一 (口胡一下就好了啊) 快速幂思想的灵活运用。 把 \(b\) 用二进制表示 , 设 \(b\) 在二进制下有 \(k\) 位 , \(c_i\) 表示 \(b\) 在二进制下的第 \(i\) 位 \[b=c_{k-1}*2^{k-1}+c_{k-2}*2^{k-2}+...+c_{0}*2^{0}\] 根据加法原理, \(a*b\) 相当于 \(b\) 个 \(a\) 相加,现在把 \(b\) 用二进制表示,那么就有: \[a*b=c_{k-1}*2^{k-1}*a+c_{k-2}*2^{k-2}*a...+c_0*2^0*a\] 根据模运算的规则,边运算边取模。 再打上类似快速幂的板子,就可以分分钟切掉这题了。这里不放代码,因为我没写。 方法二 (玄学方法) 我们知道: \[a*b \text{ mod } p = a*b-[\frac{a*b}{p}]*p\] 注:[ ]暂且看做向下取整 然后书中用了 long double 胡搞一下就过了。反正我是没看懂。 有兴趣的朋友可以写一下。 咱也不知道,咱也不敢问,咱也不想问。 来源: https://www.cnblogs.com/BaseAI/p/11406465.html

重学计算机组成原理(十)- \"烫烫烫\"乱码的由来

 ̄綄美尐妖づ 提交于 2019-11-27 18:57:27
程序 = 算法 + 数据结构 对应到计算机的组成原理(硬件层面) 算法 --- 各种计算机指令 数据结构 --- 二进制数据 计算机用0/1组成的二进制,来表示所有信息 程序指令用到的机器码,是使用二进制表示的 存储在内存里面的字符串、整数、浮点数也都是用二进制表示的 万物在计算机里都是0和1,搞清楚各种数据在二进制层面是怎么表示的,是我们的必修课。 在实际应用中最常遇到的问题,也就是文本字符串是怎么表示成二进制的,特别是我们会遇到的乱码究竟是怎么回事儿 在开发的时候,所说的Unicode和UTF-8之间有什么关系。 理解了这些,相信以后遇到任何乱码问题,你都能手到擒来了。 1 理解二进制的“逢二进一” 二进制和我们平时用的十进制,并没有本质区别,只是平时是“逢十进一”,这里变成了“逢二进一” 每一位,相比于十进制下的0~9这十个数字,我们只能用0和1这两个数字。 任何一个十进制的整数,都能通过二进制表示出来 把一个二进制数,对应到十进制,非常简单,就是把从右到左的第N位,乘上一个2的N次方,然后加起来,就变成了一个十进制数 当然,既然二进制是一个面向程序员的“语言”,这个从右到左的位置,自然是从0开始的。 比如_0011_这个二进制数,对应的十进制表示,就是 \(0×2^3+0×2^2+1×2^1+1×2^0\) \(=3\) 代表十进制的3 对应地,如果我们想要把一个十进制的数

kubernetes二进制离线安装(含docker)

倾然丶 夕夏残阳落幕 提交于 2019-11-27 14:04:14
环境:CentOS7.4 服务器环境是外网隔离状态,所需安装包需要本地下载,远程拷贝至服务器。下载好需要的包后,全部安装过程均为离线安装。 一、安装docker 下载二进制安装包https://download.docker.com/linux/static/stable/x86_64/ 1、解压 $ tar xzvf docker-18.06.1-ce.tgz 2、拷贝至/usr/bin $ sudo cp docker/* /usr/bin 3、启动docker daemon $ sudo dockerd & 4、制作 docker.service 和 docker.socket 文件(或下载) https://github.com/moby/moby/tree/master/contrib/init/systemd 其中的docker.service.rpm 文件修改名字为 docker.service;docker.socket 则不需要改动,直接复制粘贴新建一个 docker.socket 文件即可。 5、将上述步骤得到的 docker.service 和 docker.socket 文件一起放到 /etc/systemd/system 目录下 $ sudo cp docker.socket /etc/systemd/system $ sudo cp docker

子集的生成—二进制枚举

泄露秘密 提交于 2019-11-27 13:20:33
有这样的一个问题: 给定一个集合,让你输出所有的子集。 这时候二进制就派上了用场~ 我们 用0,1来表示当前位是否被保留,值为1则保留,为0则舍弃 , 如下图所示: 那么对于一个有 n 个数的集合来讲,每一位有取和不取两种状态,一共就有 2 n 种状态,我们可以从 0 一直枚举到 2 n 来表示所有子集的状态。 但是现在问题又来了,对与我们枚举的数,你怎么知道哪一位是0,哪一位是1? 这个时候就要用到位运算的知识了,对于一个数 S (子集的状态)我们拿它和 0~n 每一位 i 进行 S&(1<<i) 这样的运算就能得到对于的位是否为1( & 运算符的特点是只有当对应位都为1时,运算结果才为1) 举个栗子, S = 13,对于的二进制码为1101 1101 & 0001得到第一位为1 1101 & 0010得到第二位为0 1101 & 0010得到第三位为1 1101 & 1000得到第四位为1 这样就得到我们取集合中的1,3,4位 实现代码: for(int i = 0; i < (1<<n); i++) //二进制枚举每一个状态 for(int j = 0; j < n; j++) //枚举该状态下二进制的每一位数值 if(i&(1<<j)) //当前位是否为1 printf("%d ", a[j]); 来源: https://www.cnblogs.com

CRC校验学习

随声附和 提交于 2019-11-27 13:06:11
上面文字是来自一个 版本的介绍crc校验方式的介绍, 下面截图是一个视频crc校验原理的讲解。 通过这两部分才彻底弄清楚了crc是怎么计算的。 上部分来自 https://blog.csdn.net/weicao1990/article/details/51669853 视频来自 https://v.qq.com/x/page/l0812ydj8i2.html 1. CRC校验原理 CRC校验原理看起来比较复杂,好难懂,因为大多数书上基本上是以二进制的多项式形式来说明的。其实很简单的问题,其根本思想就是先在要发送的帧后面附加一个数(这个就是用来校验的校验码,但要注意,这里的数也是二进制序列的,下同),生成一个新帧发送给接收端。当然,这个附加的数不是随意的,它要使所生成的新帧能与发送端和接收端共同选定的某个特定数整除(注意,这里不是直接采用二进制除法,而是采用一种称之为“ 模2除法 ”)。到达接收端后,再把接收到的新帧除以(同样采用“ 模2除法 ”)这个选定的除数。因为在发送端发送数据帧之前就已通过附加一个数,做了“去余”处理(也就已经能整除了),所以结果应该是没有余数。如果有余数,则表明该帧在传输过程中出现了差错。 【说明】“模2除法”与“算术除法”类似,但它既不向上位借位,也不比较除数和被除数的相同位数值的大小,只要以相同位数进行相除即可。模2加法运算为:1+1=0,0+1=1

Leetcode二进制加法算法与分析

时光怂恿深爱的人放手 提交于 2019-11-27 05:42:45
@Leetcode二进制加法 这是一道不需要看题干就知道在问啥的题,a+b的二进制版本,来看题干: 给定两个二进制字符串,返回他们的和(用二进制表示)。输入为非空字符串且只包含数字 1 和 0。 示例 1: 输入: a = “11”, b = “1” 输出: “100” 示例 2: 输入: a = “1010”, b = “1011” 输出: “10101” 首先在落笔之前,请每个小白coder不要犯和笔者一样的错误:不要试图将二进制转换成十进制来进行计算!其实这个道理稍微思索就能明白,二进制向十进制转换时,最高位的计算是2的位数-1的次方,然而如果样例是个100位的二进制数,很容易就会因为2的100次方过大而爆栈。那么既然不能转换成十进制,就在二进制的情况下应该如何计算呢?我们要巧妙地应用字符串与ASCII码的加减,请看代码: class Solution { public: string addBinary(string a, string b) { int x=a.size(); int y=b.size(); while(x>y){ b='0'+b; y++; } while(y>x){ a='0'+a; x++; } for(int i=a.size()-1;i>0;i--){ a[i]=a[i]+b[i]-'0'; if(a[i]>='2'){ a[i]=(a[i]-

JAVA基本数据类型和注释

扶醉桌前 提交于 2019-11-27 04:10:29
一、注释 1、注释的概念 注释是程序中给人看的提示信息,会被编译器忽略;在程序编译和执行过程中不会有任何影响,仅仅在代码阅读时提供提示信息。 2、注释的形式 基本语法://注释的内容 a、 行注释 解释:其中 双斜线之后到当前行结尾的内容被注释掉了 b、块注释 基本语法:/* … */ 解释:则/* 和 */之间的内容被注释掉,可以跨多行注释 块注释在使用时, 禁止嵌套使用 。 c、文档注释 基本语法:/**...*/ 则/** 和 */之间的内容被注释掉,可以跨多行注释 文档注释在使用时,禁止嵌套使用;文档注释通常用来声明一个类的方法属性的功能,文档注释在通过javadoc命令生成文档时可以被提取成文档的一部分。 实验:编写一个类,具有文档注释,通过文档提取工具生成文档 /** 这是一个代表人的类 */ public class Person{ //声明了一个类,名叫Person public static void main(String args[]){ /* 床前明月光 疑是地上霜 举头望明月 低头思故乡 */ System.out.println("hello world~"); } 2)通过javadoc命令,提取文档 3)查看提取文档 二、进制 1、进制的概念 数字在累计时,进位的机制称之为进制。 a、十进制 逢十进一:0 1 2 3 4 5 6 7 8 9 10

java 基础 01 变量和注释、数据类型

前提是你 提交于 2019-11-27 04:10:10
1,变量和注释   比如:姓名:xiaoming  年龄:18 1.1变量的基本概念   当需要在程序中记录单个数据内容时,则需要声明一个变量来处理,而变量的本质就是内存中 申请一块存储单元用于存储数据内容,由于该存储单元的数据可以改变,因此得名"变量"。   由于存放的数据内容不同导致存储单元的大小不同,在Java语言中采用数据类型加以描述,为了便于下次访问则需要指定一个名称,叫做变量名。 1.2变量的声明方式   数据类型 变量名称 = 初始值 ; //其中初始值可以省略,但分号不可以省略   比如:      int age = 18;  //推荐使用该方式      int age;   扩展:      在main()方法的方法体中,直接声明的变量叫做局部变量,该变量的作用域从声明开始一直到方法体结束。 1.3标识符(变量名)的命名规则   (1)由字母、数字、下划线以及美元($)组成,其中数字不能开头。      如:name,age,name1,name2 等   (2)不能与java中的关键字保留字重名,所谓关键字就是java语言中用于表示特征含义的单词(保留字就时java官方定义了,但是未使用)。      如:public、class、void、static等   (3)区分大小写,长度没有限制,但是不宜过长。      如:name, Name 代表不同的变量