二进制

[算法]位运算问题之二

一曲冷凌霜 提交于 2020-03-04 20:33:21
题目一: 给定一个整形数组arr和一个大于1的整数k。已知arr中只有1个数出现了奇数次,其他的数都出现了偶数次,请返回出现了奇数次的数。 时间复杂度为O(N),额外空间复杂度为O(1)。 思路: 整数n与0异或的结果是n,整数n与整数n异或的结果是0.所以先申请一个整形变量,记为eO。把eO和每个数异或(eO=eO^当前数),最后eO的值就是出现了奇数次的那个数。 异或运算满足交换律和结合律。 public static void printOddTimesNum1(int[] arr) { int eO = 0; for (int cur : arr) { eO ^= cur; } System.out.println(eO); } 题目二: 给定一个整形数组arr,有两个数出现了奇数次,其他数都出现了偶数次。打印这两个数。 思路: 如果只有a和b出现了奇数次,那么最后的异或结果eO一定是a^b。所以,如果数组中有两个出现了奇数次的数,最终的结果eO一定不为0.那么肯定能在32位整数eO上找到一个不等于0的bit位,假设是第K为不等于0。eO在第K位上不等于0,说明a和b的第k位肯定有一个是1另一个是0.接下来再设置一个变量记为eHasOne,然后再遍历一次数组。在这次遍历中,eHasOne只与第k位上是1的整数异或,其他的数被忽略。那么在第二次遍历结束后

java的位运算

风流意气都作罢 提交于 2020-03-04 19:03:16
 在日常的Java开发中,位运算使用的不多,使用的更多的是算数运算(+、-、*、/、%)、关系运算(<、>、<=、>=、==、!=)和逻辑运算(&&、||、!),所以相对来说对位运算不是那么熟悉,本文将以Java的位运算来详细介绍下位运算及其应用。 1、 位运算起源   位运算起源于C语言的低级操作,Java的设计初衷是嵌入到电视机顶盒内,所以这种低级操作方式被保留下来。所谓的低级操作,是因为位运算的操作对象是二进制位,但是这种低级操作对计算机而言是非常简单直接,友好高效的。在简单的低成本处理器上,通常位运算比除法快得多,比乘法快几倍,有时比加法快得多。虽然由于较长的指令流水线和其他架构设计选择,现代处理器通常执行加法和乘法的速度与位运算一样快,但由于资源使用减少,位运算通常会使用较少的功率,所以在一些Java底层算法中,巧妙的使用位运算可以大量减少运行开销。 2、 位运算详解   Java位运算细化划分可以分为按位运算和移位运算,见下表。 细化 符号 描述 运算规则 按位运算 & 与 两位都为1,那么结果为1 | 或 有一位为1,那么结果为1 ~ 非 ~0 = 1,~1 = 0 ^ 异或 两位不相同,结果为1 移位运算 << 左移 各二进制位全部左移N位,高位丢弃,低位补0 >> 右移 各二进制位全部右移N位,若值为正,则在高位插入 0,若值为负,则在高位插入 1 >>>

二进制原码、反码、补码以及Java中的<< 和 >> 和 >>> 详细分析

强颜欢笑 提交于 2020-03-04 18:13:56
1、计算机二进制系统中最小单位bit 在计算机二进制系统中: bit (位) :数据存储的最小单元。 简记为 b ,也称为比特( bit ),每个二进制数字0或1就是一个位( bit ),其中,每 8bit = 1 byte (字节); 再回顾Java 中的数据类型,如 int数据类型 = 4个byte(字节) ,而 1 byte(字节) = 8 bit(位) ;也就我们常说的 int = 32位 (说白了,在二进制系统中是以bit 作为数据存储单元的)。如下 2、有符号数和无符号数 有符号数和无符号数简单的说就是分别对应正数和负数,在二进制系统中是以bit(位)来作为数据存储单元的, 最高位(第一位)是符号位,正数符号位为“0” ,负数符号位为“1” 。 例子: 假设 int number = 1 ,那么number在计算机系统中将表示如下: 00000000 00000000 00000000 00000001 同理可得, number = -1 时,在二进制中表示如下: 10000000 00000000 00000000 00000001 注意:最高位(第一位)是符号位,因为是number值为1是一个正数,所以最高位为0; 3、二进制的原码、反码、补码 原码 原码就是机器数,是加了一位符号位的二进制数(因为数值有正负之分),正数符号位为0,负数符号位为1。 反码

MySQL用户授权 和 bin-log日志 详解和实战

我的梦境 提交于 2020-03-04 07:40:17
看了上一篇博文的发布时间,到目前已经有三个月没更新博文了。这三个月经历了很多事情,包括工作、生活和感情等等。由于个人发展的原因,这个月准备换工作啦。在这段时间,我会把Web大型项目中所接触到的技术都总结出来,分享给各位支持我的博友。博客园是个好地方,在这里能学到很多东西,同时你也可以收获很多东西,就比如我本人,去年被两个比较大型的在线培训机构邀请当讲师(只接受了一家,当然由于太忙所以课程录制也不是特别多),另有一企业聘请我写一本技术相关的书籍(我拒了,没时间写)等等,这些都是我在博客园里得到的回报。所以还是要感谢博客园这个平台。 好了,废话不多说,直接进入今天的知识分享。这次博文我将分享下MySQL的用户授权和bin-log日志,这博文是为下一篇 MySQL主从复制技术博文做准备的,本博文并不是理论解释这些技术,而是通过实战去应用这些技术,因为,理论的东西,百度一下就一大堆,而实际如何去应用的,或者百度上比较少,所以,我分享的技术都是理论+实战,让博友阅读完本文后,就能自己动手去做实验,让自己更深入彻底地理解好这些较为高级的技术。 一、平台环境 centos6.5、MySQL5.6.22。首先当然是要有自己的环境,我是在虚拟机上去模拟实验的,因为MySQL要实现主从复制,所以需要两个服务器环境,所以在虚拟机中,你可以克隆一份一模一样的服务器,如下图:

php位运算二进制运算法则

一世执手 提交于 2020-03-04 00:08:47
位运算(二进制运算法则) 位运算 二进制: 所谓的二进制就是逢二进一(0、1)简单,易于电子方式实现 基本概念: 1.二进制的最高位是符号位:0是正数,1是负数。 2.正数的原码,反码,补码都是一样。 3.负数的反码=它的原码符号位不变,其他位取反(0->1,1->0)。 4.负数的补码=它的反码+1 0的反码,补码都是0. 6.Php没有无符号数,换言之,php中数都是有符号的 7.在计算机运算的时候,都是以补码的方式来运算的 二进制三个重要概念 1.原码 2.用二进制表示一个数字,这个码就是原码 1----> 00000000 00000000 00000000 00000101=1 2的零次方+0 2的一次方+1*2的二次方=1+0+4=5 运算规则: 按位与&:两位全为1, 结果为1 按位或|:两位一个为1, 结果为1 按位异或^:两位一个为0,一个为一, 结果是1. 按位取反~ :0->1,1->0。 来源: CSDN 作者: 小祈祈 链接: https://blog.csdn.net/qq839534800/article/details/104641361

测试笔记:测试基础

纵然是瞬间 提交于 2020-03-04 00:05:24
windows基础 软件定义 计算机=硬件加软件 软件=程序(program)+文档(document) 软件测试的对象:程序和文档都要测试 软件开发阶段划分 阶段一:需求分析阶段(由需求分析人员完成;产出物:《需求规格说明书》) 阶段二:设计阶段(由系统架构师/分析师完成;产出物:《概要设计说明书》和《详细设计说明书》) 阶段三:编码阶段(由开发人员完成/程序员完成;产出物:程序/代码) 不同的开发阶段引入的bug比例如何? 需求分析阶段引入的bug最多(大概占bug总数的55%左右) 其次是设计阶段(大概占缺陷总数的25%左右) 最少的是编码阶段(大概占缺陷总数的15%左右) 还有5%左右的缺陷是由系统兼容性或者配置原因造成的。 需求分析阶段引入的bug最多,其次是设计阶段,引入bug阶段最少的是编码阶段 因此:1)在测试中不能只测程序,文档也必须测 2)测试工作应尽早介入,并且贯穿整个开发周期始终(尽早测试原则,不断测试原则) 什么是软件缺陷 1.软件的缺陷–defect,bug 2.软件缺陷的定义:1)需求要求的功能没有实现 2)实现了需求没有的功能(画蛇添足) 3)软件出现了指明不应出现的错误 4)需求虽未明确指明,但是应该实现的功能没有实现 eg:法规; 说明:需求不是完美的,有可能有遗漏,但是测试人员应该专业,发现bug就要提交,即使需求中没有提及 5)软件不易使用

连续受限玻尔兹曼机

断了今生、忘了曾经 提交于 2020-03-03 19:19:25
连续 RBM 连续 RBM 是受限玻尔兹曼机的一种形式,它通过不同类型的对比散度采样接受连续的输入(也就是比整数切割得更细的数字)。这允许 CRBM 处理图像像素或字数向量这类被归一化到 0 到 1 之间的小数的向量。 应该注意,深度学习网络的每一层都需要四个元素:输入、系数、偏置项以及变换(激活算法)。 输入是数值数据,是一个来自于前面层(或者原始数据)的向量。系数是通过每个节点层的特征的权重。偏置项确保部分节点无论如何都能够被激活。变换是一种额外的算法,它在数据通过每一层以后以一种使梯度(梯度是网络必须学习的)更容易被计算的方式压缩数据。 这些额外算法和它们的组合可以逐层变化。 一种有效的连续 RBM 在可见(或者输入)层上使用高斯变换,在隐藏层上使用整流线性单元(ReLU)变换。这在面部重建中特别有用。对于处理二进制数据的 RBM 而言,只需要进行二进制转换即可。 高斯变换在 RBM 的隐藏层上的表现不好。相反,使用 ReLU 变换能够表示比二进制变换更多的特征,我们在深度置信网络中使用了它。 REF https://baijiahao.baidu.com/s?id=1599798281463567369&wfr=spider&for=pc https://uwaterloo.ca/data-analytics/sites/ca.data-analytics/files

二进制恢复案例

守給你的承諾、 提交于 2020-03-03 13:24:58
二进制文件恢复先决: 先决1.0:查看系统变量log_bin,如果其值为OFF,表示没有开启二进制日志(binary log)。 不知道为什么,我就是喜欢手动的真正开启。下面跟我一起来做。不要遵循SQL默认的规则 先决2.0:开启二进制日志,修改my.cnf,在[mysqld]下面增加 [root@yulong01 ~]# vim /etc/my.cnf [mysqld] log-bin=/data/mysql/binlogs/server1(这个目录需要777权限,server1文件) server_id = 100 先决3.0 [root@yulong01 ~]# systemctl restart mysqld 先决4.0(非常tm的重要) 如果想要可以更改的日志文件: 则必须修改statement类型为ROW: mysql> set global binlog_format = 'ROW'; 退出数据库,重新启动服务! 样例恢复案件 1.创建test_db01数据库,并且创建t1表: 1.1 mysql> create database test_db01; Query OK, 1 row affected (0.11 sec) 1.2 mysql> use test_db01; Database changed 1.3 mysql> create table if not

redis中list类型中的ziplist笔记

ぐ巨炮叔叔 提交于 2020-03-03 06:47:40
ZipList(压缩列表): 1. 介绍: 内存连续,无序的数据结构.压缩列表是redis为了节约内存而开发的,由一系列特殊编码的连续内存块 组成的顺序型数据结构. 2. 组成: 3. 压缩列表节点的组成 一个压缩列表可以包含任意多个节点(entry),每个节点可以保存一个字节数组或者一个整数值. 1) previous_entry_length 无符号(1字节) 0到255 2^8-1 >> 255(10进制) FF(16进制) 二进制 1111 1111 8bit 有符号(1字节)-128到127 无符号(2字节) 0到65535 2^16-1 >> 65535(10进制) FFFF(16进制) 二进制 1111 1111 1111 1111 16bit 有符号(2字节) -32768到32765 无符号(4字节) 0到4294967295 2^32-1 >> 4294967295(10进制) FFFF FFFF(16进制) 二进制 1111 1111 1111 1111 1111 1111 1111 1111 32bit 有符号(4字节)-2147483648到2147483647 pervious_entry_length属性以字节为单位,记录了压缩列表中前一个节点的长度. 如果前一节点的长度小于254个字节,那么previous_entry_length属性

二进制协议 vs 文本协议

六月ゝ 毕业季﹏ 提交于 2020-03-03 03:39:29
二进制协议 vs 文本协议 在服务器程序开发过程中,各个服务直接需要进行交互。这样就需要定义消息的协议,一般来说协议主要包括二进制协议和文本协议,下面就我在工作中用到的两种协议说说自己的看法。 1 二进制协议 目前在公司做服务器后台开发的工作,需要多个服务程序进行交互。因为是TCP直连,所以直接采用二进制消息的方式。消息的定义统一采用消息头(消息ID+消息长度)+x消息体(消息内容)的方式,所以扩展是比较方便的。用代码表示如下 struct CommonMsg { uint32_t m_msgId; uint32_t m_msgLen; }; struct KeepAlive:public CommonMsg { uint32_t m_timeStamp; }; doRead() { CommonMsg * msg=(CommonMsg*)buffer; if(msg->m_msgId==ID_KEEP_ALIVE) { handleKeepAlive(msg); } } 1.1 优点 二进制协议有以下几个优点: 1. 节约内存,带宽。 二进制协议只保存了必须的信息,在需要传递大量信息的时候,对于带宽的节省是非常明显的。 2. 方便加密。 二进制协议很方便使用异或 或者压缩的方式进行加密,防止协议被破解,从而保护了传递的信息,增加协议破解的难度。 1.2 缺点