二进制

利用位运算消除二进制最后一个1,计算二进制中1的个数

佐手、 提交于 2020-02-21 01:56:21
这几天刷leetcode学习了一个新知识,利用位运算来消除二进制的最后一个1,进一步还可以计算一个二进制有多少个1 假设一个n = 01101010,我们把它减一即n-1 = 01101001,然后再将它们相与result = n&(n-1) = 01101000,就可以把最后一个1消除了,原理也很简单,n-1的话,会一直向前寻找可借的位,从而跳过低位连续的0,而向最低位的1借位,借位后最低位的1变为0,原先最低位1的下一位从0变为1,其余位都不变,相与之后其它位不变,1(最低位1)0 &01(n-1对应的位)= 00,从而消除最低位的1。 利用这个原理计算二进制中1的个数 int countOne(int n){ int res = 0; while(n!=0){ res++; n = n&(n-1); } return res; } 来源: CSDN 作者: vegeticken 链接: https://blog.csdn.net/weixin_41506373/article/details/104412138

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

爷,独闯天下 提交于 2020-02-20 11:45:11
  前言:最近一个一个很奇怪的问题,很明白的说,就是没看懂,参照下面的代码: /// <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(data, 0, data.Length); } catch

位运算

别来无恙 提交于 2020-02-20 10:23:11
1.位运算概述 从现代计算机中所有的数据二进制的形式存储在设备中。即0、1两种状态,计算机对二进制数据进行的运算(+、-、*、/)都是叫位运算,即将符号位共同参与运算的运算。 口说无凭,举一个简单的例子来看下CPU是如何进行计算的,比如这行代码: int a = 35; int b = 47; int c = a + b; 计算两个数的和,因为在计算机中都是以二进制来进行运算,所以上面我们所给的int变量会在机器内部先转换为二进制在进行相加: 35: 0 0 1 0 0 0 1 1 47: 0 0 1 0 1 1 1 1 ———————————————————— 82: 0 1 0 1 0 0 1 0 所以,相比在代码中直接使用(+、-、*、/)运算符,合理的运用位运算更能显著提高代码在机器上的执行效率。 2.位运算概览[td] 符号 描述 运算规则 & 与 两个位都为1时,结果才为1 | 或 两个位都为0时,结果才为0 ^ 异或 两个位相同为0,相异为1 ~ 取反 0变1,1变0 << 左移 各二进位全部左移若干位,高位丢弃,低位补0 >> 右移 各二进位全部右移若干位,对无符号数,高位补0,有符号数,各编译器处理方法不一样,有的补符号位(算术右移),有的补0(逻辑右移) 3.按位与运算符(&) # 定义:参加运算的两个数据,按二进制位进行“与”运算。 运算规则: 0&0=0 0

位运算

北慕城南 提交于 2020-02-20 10:07:16
1.位运算概述 从现代计算机中所有的数据二进制的形式存储在设备中。即0、1两种状态,计算机对二进制数据进行的运算(+、-、*、/)都是叫位运算,即将符号位共同参与运算的运算。 口说无凭,举一个简单的例子来看下CPU是如何进行计算的,比如这行代码: int a = 35; int b = 47; int c = a + b; 计算两个数的和,因为在计算机中都是以二进制来进行运算,所以上面我们所给的int变量会在机器内部先转换为二进制在进行相加: 35: 0 0 1 0 0 0 1 1 47: 0 0 1 0 1 1 1 1 ———————————————————— 82: 0 1 0 1 0 0 1 0 所以,相比在代码中直接使用(+、-、*、/)运算符,合理的运用位运算更能显著提高代码在机器上的执行效率。 2.位运算概览 [td] 符号 描述 运算规则 & 与 两个位都为1时,结果才为1 | 或 两个位都为0时,结果才为0 ^ 异或 两个位相同为0,相异为1 ~ 取反 0变1,1变0 << 左移 各二进位全部左移若干位,高位丢弃,低位补0 >> 右移 各二进位全部右移若干位,对无符号数,高位补0,有符号数,各编译器处理方法不一样,有的补符号位(算术右移),有的补0(逻辑右移) 3.按位与运算符(&) # 定义:参加运算的两个数据,按二进制位进行“与”运算。 运算规则: 0&0=0

每天一个linux命令(17):whereis

时光总嘲笑我的痴心妄想 提交于 2020-02-20 08:25:29
1、命令简介 whereis (whereis) 命令用来定位指令的二进制程序、源代码文件和man手册页等相关文件的路径。 whereis命令只能用于程序名的搜索,而且只搜索二进制文件(参数-b)、man说明文件(参数-m)和源代码文件(参数-s)。如果省略参数,则返回所有信息。 和find相比,whereis查找的速度非常快,这是因为linux系统会将 系统内的所有文件都记录在一个数据库文件中,当使用whereis和下面即将介绍的locate时,会从数据库中查找数据,而不是像find命令那样,通过遍历硬盘来查找,效率自然会很高。 但是该数据库文件并不是实时更新,默认情况下时一星期更新一次,因此,我们在用whereis和locate 查找文件时,有时会找到已经被删除的数据,或者刚刚建立文件,却无法查找到,原因就是因为数据库文件没有被更新。 2、用法 whereis [ -sbmu ] [ -SBM dir ... -f ] name... 3、选项 -b:只查找二进制文件; -B<目录>:只在设置的目录下查找二进制文件; -f:不显示文件名前的路径名称; -m:只查找说明文件; -M<目录>:只在设置的目录下查找说明文件; -s:只查找原始代码文件; -S<目录>只在设置的目录下查找原始代码文件; -u:查找不包含指定类型的文件。 4、示例 示例1:查看默认的jdk [root

哈希算法和非对称加密算法的理解

此生再无相见时 提交于 2020-02-20 07:52:09
2018年开始听说区块链,从中本聪到智能合约;从加密货币到区块链;从比特币到钱包 ……今天我们再学点新知识。 1、哈希算法是什么? 哈希算法又叫散列算法,是将任意长度的二进制值映射为较短的固定长度的二进制值,这个小的二进制值称为哈希值。它的原理其实很简单,就是把一段交易信息转换成一个固定长度的字符串。 这串字符串具有一些特点: 1. 信息相同,字符串也相同。 2. 信息相似不会影响字符串相同。 3. 可以生成无数的信息,但是字符串的种类是一定的,所以是不可逆的。 让我们举个例子理解一下:如果我们要搜一张图片,在没有人工标注的情况下,于巨大的图库中想要以图搜图是一件及其庞大而又困难的工作量。 来源: CSDN 作者: li.junmin 链接: https://blog.csdn.net/Doudou_Mylove/article/details/104398277

mysql的主从复制

∥☆過路亽.° 提交于 2020-02-19 14:33:34
1. 为什么需要主从复制?   a. 在复杂的业务中,有一个sql需要锁表,导致不能使用读的服务,影响业务的运行,使用主从复制,让主库写,从库读,保证业务的运行   b. 做数据的热备   c. 架构扩展,业务量原来越大,I/O访问评率过高,做多库存储,提高单个机器的I/O性能 2. 原理(默认采用的是异步的方式,不是强一致性)   MySQL 中有一种日志叫做 bin 日志(二进制日志),这个日志会记录下所有修改了数据库的SQL语句。主从复制的原理其实就是"从"服务器向"主"服务器请求这个日志文件,"主"服务器会把这个 bin 日志复制到"从"服务器上执行一遍,这样"从"服务器上的数据就和"主"服务器上的数据相同了。      主服务器必须启动二进制日志binlog,记录任何修改数据库数据的sql   从服务器开启一个线程(I/O thread)把自己扮演成mysql的客户端,通过mysql协议,请求主服务器的二进制日志文件binlog   主服务器启动一个线程(Dump thread),检查自己二进制日志中的sql,核对参数,对比,将binlog日志发送到从服务器   从服务器接收到主服务器的数据放到中继日志relay log文件中   从服务器启动一个线程sql thread,把relay log中的事件读取出来,在本地执行 3. mysql主从同步延时分析  

MySQL主从同步

蹲街弑〆低调 提交于 2020-02-19 07:20:50
主从复制是指将主数据库的DDL和DML操作通过二进制日志传到数据库上,然后在从数据库上对这些日志进行重新执行,使从数据库和主数据库的数据一致 原理 MySQL主库在事务提交时会把数据变更记录在二进制日志Binlog中 主库推送二进制日志文件Binlog中的事件到从库的中继RelayLog中,之后从库根据中继日志重做数据变更操作,通过逻辑复制来达到主库和从库的数据一致性 MySQL通过三个线程来完成主从数据库间的数据复制,其中Binlog Dump线程跑在主库上,I/O线程和sql线程跑在从库 当在从库启动复制时,首先创建I/O线程连接主库,主库随后创建BinlogDump线程读取数据库事件并发送给I/O线程,I/O线程获取到事件数据后更新到从库的中继日志RelayLog中去,,之后从库上的sql线程读取中继日志relayLog中更新的数据库事件并应用 实例搭建(使用docker) 运行MySQL主实例 docker run -p 3307:3306 --name mysql-master \ -v /mydata/mysql-master/log:/var/log/mysql \ -v /mydata/mysql-master/data:/var/lib/mysql \ -v /mydata/mysql-master/conf:/etc/mysql \ -e MYSQL_ROOT

在VC中,如何修改文件的只读属性设置

跟風遠走 提交于 2020-02-19 01:49:34
static char BASED_CODE szFilter[] = "*.ppt"; CFileDialog FileDlg(TRUE,"PPT",NULL,OFN_FILEMUSTEXIST|OFN_NONETWORKBUTTON |OFN_PATHMUSTEXIST,szFilter); FileDlg.DoModal(); // To get the selected file's path and name CString strFileName; strFileName = FileDlg.GetPathName(); //-------------------将只读文件的只读属性去掉----------------------- CFileStatus rStatus; CFile::GetStatus(strFileName,rStatus);//获得文件的属性设置 rStatus.m_attribute=rStatus.m_attribute & 0x3E ; //如果文件为只读的,将只读属性去掉 //-------------------------------------------- CFile::SetStatus(strFileName, rStatus );//更改文件的属性设置 …… } enum Attribute { normal = 0x00

移动端图片操作(一)——上传

拈花ヽ惹草 提交于 2020-02-18 18:46:54
上传我们一般都是用“ input[type=file] ”控件。当你用此控件时,你就授权了网页和服务器访问对应的文件,就可以得到 File 对象。 友情提示在,在Android手机webview中,是不支持上传文件的,网上说是修改Android端的代码,但我没试过,我们这边是使用客户端提供的接口来实现上传的。 下面的示例代码可以在 这里 查看到。 一、accept属性 该属性表明了服务器端可接受的文件类型,可以限制你手机选择相关的文件,如果限制多个,可以用逗号分割,下面的代码就表示只能选择图片与音频相关的文件: <input accept="image/*,audio/*" type="file"/> 在移动端,点击后会让你选择拍照或相册,还是蛮高大上的。下图是UC浏览器中: 二、change事件 一般选择文件都会使用“change”事件,下面的代码就是绑定了change事件,弹出文件大小: var upload = document.getElementById('upload'); upload.addEventListener('change', function() { var file = upload.files[0]; alert(file.size); }, false); 1) 有些手机浏览器在点击的时候,会弹出键盘选择,我用onfocus="this.blur(