与运算

HashMap 下标计算

痞子三分冷 提交于 2019-12-04 13:34:12
从HashMap源码中,可以看到求容器下标值的方法,有两步,首先通过key值计算hash,然后用hash计算下标:   计算hash:   return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);   计算下标,其下标值为:(n-1) & hash  n = (tab = resize()).length; p = tab[i = (n - 1) & hash]   即,是通过key的hash值和容器的大小减1,两者进行与运算,获取容器数组下标。这里使用与运算,其实蕴含了一个隐藏条件,即数组的大小n,必须是2的n次方,否则,计算出来的下标值i是无法覆盖这个范围[0, n-1]的。   举个例子,假设两种情况,一种容器大小为10,不是2的幂,另外一种容器大小为16,刚好是2的4次方。   则,对于第一种,n-1= 9, 二进制表示为 1001,任何值与该值进行与运算,都无法改变中间的两个0,只能改变首尾的两个1,因此结果范围就缩小了一倍   而,对于第二种,n-1=15,二进制表示为 1111,该值与其他值与运算后,可以覆盖范围[0, 15],而这个范围刚好是数组的大小,因此只要hash值均匀分布,结果也是均匀的。   实际上,只要数组大小是2的幂,则 (n-1) & hash 的结果等效于: hash % (n-1)

你必须知道的基本位运算技巧(状压DP、搜索优化都会用到)

若如初见. 提交于 2019-12-03 13:22:01
一. 位操作基础 基本的位操作符有与、或、异或、取反、左移、右移这6种,它们的运算规则如下所示: 符号 描述 运算规则 & 与 两个位都为1时,结果才为1 | 或 两个位都为0时,结果才为0 ^ 异或 两个位相同为0,相异为1 ~ 取反 0变1,1变0 << 左移 各二进位全部左移若干位,高位丢弃,低位补0。1<<n等于2的n次方 >> 右移 各二进位全部右移若干位,对无符号数,高位补0,有符号数,各编译器处理方法不一样,有的补符号位(算术右移),有的补0(逻辑右移)。n>>2 等于 n/2的n次方 注意: 1. 在这6种操作符,只有~取反是单目操作符,其它5种都是双目操作符。 2. 位操作只能用于整形数据,对float和double类型进行位操作会被编译器报错。 二. 常用位操作小技巧 简单的位运算 1.’&’符号,x&y,会将两个十进制数在二进制下进行与运算,然后 返回其十进制下的值。例如3(11)&2(10)=2(10)。 2.’|’符号,x|y,会将两个十进制数在二进制下进行或运算,然后 返回其十进制下的值。例如3(11)|2(10)=3(11)。 3.’^’符号,x^y,会将两个十进制数在二进制下进行异或运算,然 后返回其十进制下的值。例如3(11)^2(10)=1(01)。 4.’<<’符号,左移操作,x<<2,将x在二进制下的每一位向左移动两位,最右边用0填充,x<

多周期CPU设计与实现

匿名 (未验证) 提交于 2019-12-03 00:39:02
设计一个多周期CPU,该CPU至少能实现以下指令功能操作。指令与格式如下: ==> 算术运算指令 1. add rd , rs, rt (说明:以助记符表示,是汇编指令;以代码表示,是机器指令) 000000 rs(5λ) rt(5λ) rd(5λ) reserved 功能:rd←rs + rt。reserved为预留部分,即未用,一般填“0”。 2. addi rt , rs ,immediate 000010 rs(5λ) rt(5λ) immediate(16λ) 功能:rt←rs + (sign-extend)immediate;immediate符号扩展再参加“加”运算。 3. sub rd , rs , rt 000001 rs(5λ) rt(5λ) rd(5λ) reserved 功能:rd←rs - rt ==> 逻辑运算指令 4. ori rt , rs ,immediate 010010 rs(5λ) rt(5λ) immediate(16λ) 功能:rt←rs | (zero-extend)immediate;immediate做“0”扩展再参加“或”运算。 5. and rd , rs , rt 010001 rs(5λ) rt(5λ) rd(5λ) reserved 功能:rd←rs & rt;逻辑与运算。 6. or rd , rs , rt

Java 中int与byte数组转换详解

一笑奈何 提交于 2019-12-02 16:28:18
1、与运算符的理解(&): 参加运算的两个数据,按二进位进行“与”运算。如果两个相应的二进位都为1,则该位的结果值为1,否则为0。即 0&0=0;0&1=0;1&0=0;1&1=1; 例子:int x = 62255550; y =0xff; 转二进制:x = 62255550 = 11101101011111000110111110; y = 0xFF = 11111111 ; 11 10110101 11110001 10111110 &00 00000000 00000000 11111111 00 00000000 00000000 10111110 (从右到左做与运算,不足的补0) 如果参加&运算的是负数(如-3 & -5),则以补码形式表示为二进制数,然后按位进行“与”运算。 2、移位运算:java移位运算符三种:<<(左移)、>>(带符号右移)和>>>(无符号右移)。 --1、 左移运算符 左移运算符<<使指定值的所有位都左移规定的次数。 1)它的通用格式如下所示: value << num num 指定要移位值value 移动的位数。 左移的规则只记住一点:丢弃最高位,0补最低位 如果移动的位数超过了该类型的最大位数,那么编译器会对移动的位数取模。如对int型移动33位,实际上只移动了33%32=1位。 2)运算规则 按二进制形式把所有的数字向左移动对应的位数

Java逻辑运算符与为运算符

ε祈祈猫儿з 提交于 2019-12-02 14:37:30
Java逻辑运算符与位运算符 逻辑运算符(boolean数据) && 称为逻辑与运算,仅当两个数都为真(即true)时,结果才为真 || 称为逻辑或运算,其中一个数为真(即true)时,结果为真 ! 称为逻辑非运算,将原数取反 A B A&&B A||B !A true true true true falsse true false false true fase false true false true true false false false false rue 位运算符(整型和字符型) ~ “按位非” ~A 将A按比特位取反,规则:遇1则0,遇0则1 & “按位与” A&B 按A与B的比特位取与, 规则:相对位全1则1,否则为0 | “按位或” A|B 按A与B的比特位取或, 规则:相对位全0则0,否则为1 ^ “按位异或” A^B 按A与B的比特位取异或, 规则:相对位相同为0,否则为1 A B ~A A&B A|B A^B 1 1 0 1 1 0 1 0 0 0 1 1 0 1 1 0 1 1 0 0 1 0 0 0 逻辑运算符与为运算符的区别 1、逻辑运算符是逻辑运算,仅能用于boolean(布尔型)运算,而位运算符是比特位运算,可用于整型和字符型,也可以用作逻辑运算; 2、逻辑运算符有短路的情况,就是(表达式1)||(表达式2);如果 表达式1 为true

网络基础之IP地址

混江龙づ霸主 提交于 2019-12-01 09:09:54
一、IP地址   1、IP地址就是给互联网上每一台主机 (或路由器)每一个接口分配一个在全世界范围内是唯一的32位二进制的地址标识符。现在由互联网名字和数字分配机构ICANN进行分配。   2、转换成十进制 二、分类IP    分类IP就是将IP分成若干个固定类,每一类地址都是由两个固定长度的字段组成,其中第一个字段为网络号,必须是唯一的。第二个字段为主机号。   1、A类地址     A类地址网络号占一个字节,只有7bit位可供使用,可指派的网络号为(2的7次方-2)       a、网络号全0的IP地址是一个保留地址,意思是“本网络”;       b、网络号为127的保留作为本地软件的环回测试     A类地址主机号占3个字节,每一个A类网络最大主机数是(2的24次方-2 = 16777214)       a、全0表示这个网络,5.1.2.3 => 5.0.0.0        b、全1表示这个网络所有主机,5.1.2.3 => 2.255.255.255     IP地址一共(2的32次方 = 4294967296),A类地址占了(2的31次方)50%。   2、B类地址     B类地址网络号占2个字节,可指派的网络号为(2的14次方-1)       a、网络号为128.0.0.0保留     B类地址主机号占2个字节,每一个B类网络最大主机数是(2的16次方-2 =

状压dp入门

我怕爱的太早我们不能终老 提交于 2019-11-30 06:27:39
原址: 状压dp入门 为了更好的理解状压dp,首先介绍位运算相关的知识。 1.’&’符号,x&y,会将两个十进制数在二进制下进行与运算,然后返回其十进制下的值。例如3(11)&2(10)=2(10)。 2.’|’符号,x|y,会将两个十进制数在二进制下进行或运算,然后返回其十进制下的值。例如3(11)|2(10)=3(11)。 3.’^’符号,x^y,会将两个十进制数在二进制下进行异或运算,然后返回其十进制下的值。例如3(11)^2(10)=1(01)。 4.’<<’符号,左移操作,x<<2,将x在二进制下的每一位向左移动两位,最右边用0填充,x<<2相当于让x乘以4。相应的,’>>’是右移操作,x>>1相当于给x/2,去掉x二进制下的最有一位。 这四种运算在状压dp中有着广泛的应用,常见的应用如下: 1.判断一个数字x二进制下第i位是不是等于1。 方法:if ( ( ( 1 << ( i - 1 ) ) & x ) > 0) 将1左移i-1位,相当于制造了一个只有第i位上是1,其他位上都是0的二进制数。然后与x做与运算,如果结果>0,说明x第i位上是1,反之则是0。 2.将一个数字x二进制下第i位更改成1。 方法:x = x | ( 1<<(i-1) ) 证明方法与1类似,此处不再重复证明。 3.把一个数字二进制下最靠右的第一个1去掉。 方法:x=x&(x-1)

浅谈HTTP中Get与Post的区别

青春壹個敷衍的年華 提交于 2019-11-28 15:06:47
   Http定义了与服务器交互的不同方法,最基本的方法有4种,分别是GET,POST,PUT,DELETE。URL全称是资源描述符,我们可以这样认为:一个URL地址,它用于描述一个网络上的资源,而HTTP中的GET,POST,PUT,DELETE就对应着对这个资源的 查 , 改 , 增 , 删 4个操作。到这里,大家应该有个大概的了解了,GET一般用于 获取/查询 资源信息,而POST一般用于 更新 资源信息。    1 .根据HTTP规范,GET用于信息获取,而且应该是安全的和幂等的 。   (1).所谓安全的意味着该操作用于获取信息而非修改信息。换句话说,GET 请求一般不应产生副作用。就是说,它仅仅是获取资源信息,就像数据库查询一样,不会修改,增加数据,不会影响资源的状态。   * 注意:这里安全的含义仅仅是指是非修改信息。   (2).幂等的意味着对同一URL的多个请求应该返回同样的结果。这里我再解释一下 幂等 这个概念: 幂等 (idempotent、idempotence)是一个数学或计算机学概念,常见于抽象代数中。   幂等有一下几种定义:   对于单目运算,如果一个运算对于在范围内的所有的一个数多次进行该运算所得的结果和进行一次该运算所得的结果是一样的,那么我们就称该运算是幂等的。比如绝对值运算就是一个例子,在实数集中,有 abs(a) = abs(abs(a))

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

痴心易碎 提交于 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

二进制中1的个数

旧巷老猫 提交于 2019-11-28 03:47:22
题目: 输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。 解法一:就是让数字的每一位与1做位运算。 然后有一种做法把输入的的数字不断右移再和1做与运算来判断该位是否为1是错误的。 比如0x80000000,把其右移一位得到的是0xC0000000,不是0x40000000,因为在移位的时候会在高位补充符号位置。 所以应该把1来左移,然后再和原来的数做与运算。 比如判断1110(数字-6)的1的个数,首先1110 & 1 把1左移一位然后与运算 然后1110 & 10(即数字2) 然后1110 & 100 然后1110 & 1000 这样去判断1的个数 class Solution { public: int NumberOf1(int n) { int ans = 0; unsigned int opt = 1; while(opt)//opt一直左移低位补零,当opt为0结束循环 { if(n & opt) ans++;//1的个数增加 opt<<=1; } return ans; } }; 解法二:将一个整数减去1,再和原来整数做与运算,会把最右边的1变成0.有多少个1就可以这样操作多少次 class Solution { public: int NumberOf1(int n) { int ans = 0; while(n) { ans++; n = (n