位运算

位运算

ε祈祈猫儿з 提交于 2020-02-06 11:16:26
算术左移和逻辑左移的效果是一样的,效果都是*2 逻辑右移最高位补0,算术右移最高位补符号位 来源: https://www.cnblogs.com/yirufeng/p/12267790.html

c++学习笔记(七)

夙愿已清 提交于 2020-02-05 21:28:37
位运算和sizeof运算符 位运算 C语言中提供了一些运算符可以直接操作整数的位,称为位运算,因此位运算中的操作数都必须是整型的。 位运算的效率是比较高的,而且位运算运用好的话会达到意想不到的效果。 位运算主要有6种:与(&),或(|),取反(~),异或(^),左移(<<),右移(>>)。 位运算符满足左结合律且优先级如下:比算术运算符优先级低,比关系运算符、条件运算符和赋值运算符优先级高。 因此一次使用多个运算符的时候应该在适当的地方加上括号。 sizeof运算符 sizeof 是一个关键字,它是一个编译时运算符,用于判断变量或数据类型的字节大小。 sizeof 运算符可用于获取类、结构、共用体和其他用户自定义数据类型的大小。 使用sizeof的语法: sizeof (data type) 其中,data type 是要计算大小的数据类型,包括类、结构、共用体和其他用户自定义数据类型。 sizeof expr 在第二种形式中,sizeof返回的是表达式结果类型的大小,并不实际计算其运算对象的值。 注意: 1.定义一个空的类型,里面没有任何成员变量和成员函数,对该类型求sizeof,所求结果为1。 2.对char或者类型为char的表达式执行sizeof运算,结果得1。 3.3.运算符优先级总结:算术>关系>逻辑>条件>赋值>逗号。 来源: https://www.cnblogs

位运算

房东的猫 提交于 2020-02-05 01:57:22
318. 最大单词长度乘积 真的感受到了位运算的强大威力。 来源: CSDN 作者: iking83 链接: https://blog.csdn.net/iking83/article/details/104173268

常用技巧 —— 位运算

烈酒焚心 提交于 2020-02-05 01:15:41
【概述】 在计算机中,数据都是以二进制形式存储的,因此位运算实质就是对整数在内存中的二进制位直接进行操作。 灵活使用位运算,不仅能有效的提高程序的效率,而且还能为代码提供亮点。 此外,在程序设计竞赛中,位运算,也是一种常考的要点,例如:树状数组中的 lowbit 函数的使用等,在 STL 容器中,bitset 也是一种常用的位运算工具。 关于 bitset: 点击这里 【应用】 位运算基础: 点击这里 异或运算实现两数交换: 点击这里 异或 1 的妙处: 点击这里 位运算应用: 点击这里 【例题】 And(CF-1013B) (基本位运算) : 点击这里 合法整数集(51Nod-1315) (位运算) : 点击这里 搬货物(51Nod-1596) (位运算) : 点击这里 FT Robot(AtCoder-3726) (bitset+思维) : 点击这里 Cupboards(CF-248A) (bitset+思维) : 点击这里 AND Minimum Spanning Tree(HDU-6614) (lowbit) : 点击这里 来源: CSDN 作者: Alex_McAvoy 链接: https://blog.csdn.net/u011815404/article/details/104173153

位运算

三世轮回 提交于 2020-02-04 20:25:39
定义 程序中数据都是以二进制形式存储的,位运算就是直接对二进制位进行操作,处理速度非常快。 符号 符号 描述 运算规则 & 与 两个位都为1时,结果才为1,其他情况结果为0 | 或 两个位都为0时,结果才为0,其他情况结果为1 ^ 异或 两个位相同时,结果为0,不同时,结果为1 ~ 取反 0变1,1变0 << 左移 各二进制位左移若干位,高位丢弃,低位补0 >> 右移 各二进制位全部右移若干位,对于无符号数,高位补0;对于有符号数, 各编译器处理方法不一样,有的补符号位(算数右移),有的补0(逻辑右移) 逻辑右移就是不考虑符号位,右移一位,左边补零即可。 算术右移需要考虑符号位,右移一位,若符号位为1,就在左边补1;否则就补0。` 有符号数的最高位是符号位,0表示正数,1表示负数,在计算机中,负数以原码的补码形式表达 正数的原码,反码,补码都相同。 负数的原码是对应正数的原码将符号位从0改为1,负数的反码为对该数的原码除符号位外各位取反,负数的补码为负数的反码再加1。 例子:2的8位原码为 00000010,-2的8位原码为 10000010,-2的反码为 11111101,-2的补码为 11111110。 20 原码 00010100 -20 10010100 -20 10001011 10001100 异或特点 x ^ 0 = x x ^ 1s = ~x // 1s = ~0

136. 只出现一次的数字(位运算)

六眼飞鱼酱① 提交于 2020-02-04 15:47:36
方法一: 利用位运算的性质: 利用 x ^ x = 0 的特点,可以将三个数中重复的两个数去除,只留下另一个数。 例如:2,1,2 2^1 = 3, 3^2 = 1 class Solution { public int singleNumber ( int [ ] nums ) { int res = nums [ 0 ] ; for ( int i = 1 ; i < nums . length ; i ++ ) { res = res ^ nums [ i ] ; } return res ; } } 方法二: 用哈希表 class Solution { public int singleNumber ( int [ ] nums ) { Map < Integer , Integer > map = new HashMap < > ( ) ; for ( int i : nums ) { Integer cnt = map . get ( i ) ; cnt = cnt == null ? 1 : ++ cnt ; map . put ( i , cnt ) ; } for ( int i : map . keySet ( ) ) { if ( map . get ( i ) == 1 ) return i ; } return - 1 ; } } 来源: CSDN 作者:

leetcode位运算

北城以北 提交于 2020-02-03 09:02:36
位运算 1,只出现一次的数字(136) 采用位运算中的异或运算,异或运算满足交换律与结合律 ^ class Solution ( object ) : def singleNumber ( self , nums ) : """ :type nums: List[int] :rtype: int """ res = 0 for i in nums : res ^ = i return res 2,颠倒二进制位(190) 采用位运算中的右移>>与左移<<操作 class Solution : # @param n, an integer # @return an integer def reverseBits ( self , n ) : res = 0 count = 32 while count : res << = 1 res += n & 1 n >> = 1 count -= 1 return int ( bin ( res ) , 2 ) 3,位1的个数(191) 采用位运算中的&操作 num&(num-1)可以消去num末尾的0 class Solution ( object ) : def hammingWeight ( self , n ) : """ :type n: int :rtype: int """ res = 0 while n : n = n & (

python核心编程:七分钟全面了解位运算

醉酒当歌 提交于 2020-02-03 04:05:44
位运算是我们在编程中常会遇到的操作,但仍然有很多开发者并不了解位运算,这就导致在遇到位运算时会“打退堂鼓”。实际上,位运算并没有那么复杂,只要我们了解其运算基础和运算符的运算规则,就能够掌握位运算的知识。接下来,我们一起学习位运算的相关知识 文章目录 位运算的基础 二进制 补码 按位与 按位取反 左移运算 右移运算 位运算的应用 判断数字奇偶 变量交换 取 x 的第 k 位 代替地板除 程序中的数在计算机内存中都是以二进制的形式存在的,位运算就是直接对整数在内存中对应的二进制位进行操作。 位运算的基础 我们常用的 3, 5 等数字是十进制表示,而位运算的基础是二进制。即人类采用十进制,机器采用的是二进制,要深入了解位运算,就需要了解十进制和二进制的转换方法和对应关系。 二进制 十进制转二进制时,采用“除 2 取余,逆序排列”法: 用 2 整除十进制数,得到商和余数; 再用 2 整除商,得到新的商和余数; 重复第 1 和第 2 步,直到商为 0; 将先得到的余数作为二进制数的高位,后得到的余数作为二进制数的低位,依次排序; 排序结果就是该十进制数的二进制表示。例如十进制数 101 转换为二进制数的计算过程如下: 逆序排列即二进制中的从高位到低位排序,得到 7 位二进制数为 1100101,如果要转换为 8 位二进制数,就需要在最高位补 0。即十进制数的 8 位二进制数为

位运算(按位与、按或与、异或)

我们两清 提交于 2020-02-03 00:07:05
位运算使用二进制补码进行运算。 按位与运算符(&) 参加运算的两个数,按二进制位进行“与”运算。 运算规则:只有两个数的二进制同时为1,结果才为1,否则为0。 即 0 & 0= 0 ,0 & 1= 0,1 & 0= 0, 1 & 1= 1。 例:3 &5 即 00000011 & 00000101 = 00000001 ,所以 3 & 5的值为1。 按位或运算符(|) 参加运算的两个数,按二进制位进行“或”运算。 运算规则:参加运算的两个数只要两个数中的一个为1,结果就为1。 即 0 | 0= 0 , 1 | 0= 1 , 0 | 1= 1 , 1 | 1= 1 。 例:2 | 4 即 00000010 | 00000100 = 00000110 ,所以2 | 4的值为 6 。 异或运算符(^) 参加运算的两个数,按二进制位进行“异或”运算。 运算规则:参加运算的两个数,如果两个相应位为“异”(值不同),则该位结果为1,否则为0。 即 0 ^ 0=0 , 0 ^ 1= 1 , 1 ^ 0= 1 , 1 ^ 1= 0 。 例: 2 ^ 4 即 00000010 ^ 00000100 =00000110 ,所以 2 ^ 4 的值为6 。 来源: https://www.cnblogs.com/Cnxz/p/12254278.html