位运算相关

位运算符/移位运算符

运算符

  • &运算符

    操作数1的位 操作数2的位 &的结果位
    1 1 1
    1 0 0
    0 1 0
    0 0 0
  • |运算符
    操作数1的位 操作数2的位 &的结果位
    1 1 1
    1 0 1
    0 1 1
    0 0 0
  • ^运算符
    操作数1的位 操作数2的位 ^的结果位
    1 1 0
    1 0 1
    0 1 1
    0 0 0
  • ~运算符
    操作数的位 ~的结果位
    1 0
    0 1

移位运算符

  • 原因:
    主要用于高度优化的代码,在这些代码中,使用其他数据操作的开销太高了
  • 示例:
    int var1, var2 = 10, var3 = 2;
    var1 = var2 << var3;
  • 结果:
    var1 = 40。
    具体过程如下:10的二进制值是1010,把该数值向左移动两位,得到0010 1000,即十进制中的40
  • 快速记忆

   向左位移:等于当前的值乘以移动位数再乘以2

var1 = var2 << var3;
var1 = var2 * var3 * 2
// var1 = 10 * 2 * 2 = 40

   向右位移:等于当前的值除以移动位数再除以2,最后舍去非整数部分

var1 = var2 >> var3;
var1 = var2 / (var3 * 2)
// var1 = 10 / ( 2 * 2) = 2.5
// 然后小数部分被丢弃var1 = 2
// 向右位移操作的时候非整数部分直接丢弃
时间: 2024-08-29 16:41:23

位运算相关的相关文章

位运算相关内容整理

位运算相关内容整理 1) 负数 负数的右移:负数右移的话,由于要保持它是负数,所以负数的二进制的左边补1.如果一直右移的话,最后就就变成0xFFFFFFFF 即-1 如: -4>>1 为-2 :-4>>2为-1 负数的左移:跟正整数左移一样,右边补0.左移总是在低位补零,高位丢失,因而负数左移后可能会变成正数. int x = 0x8fff0000; cout << (x << 1); // 输出为536739840 cout << (-2 &l

!codeforces 558C Amr and Chemistry-yy题-(位运算相关)

题意:有n个数,每次进行的操作只能是除以2或者乘以2,求这n个数转换成同一个数字所需要的最小的操作步数 分析: 乍一看题目,觉得好难,对于这种每次有两种情况求最后到达的终点的balabala的我就觉得很复杂,这道题说明其实并不可怕,至少有一部分并不可怕. 这道题的做法是暴力枚举出每个数能够走到的所有的数,记录步数,最后找交点输出最小值即可.找交点也不要想复杂了,这n个数都能到达的数就是交点,那么只需要用一个数组记录能到到达这个点的起点个数,最后起点个数等于n的就是交点,这在以每个起点出发枚举的时

N皇后问题(位运算实现)

本文参考Matrix67的位运算相关的博文. 顺道列出Matrix67的位运算及其使用技巧 (一) (二) (三) (四),很不错的文章,非常值得一看. 主要就其中的N皇后问题,给出C++位运算实现版本以及注释分析. 皇后问题很经典,就不再赘述问题本身,解决皇后问题,一般采用的都是深搜DFS+回溯的方法,按照行(列)的顺序枚举每一个可以放置的情况,然后进行冲突判断,当前的放置是否合法,合法就继续搜索下一层,不合法就搜索就回溯.直到,找到一个合法的解,每一层都有一个皇后并且不发生冲突,这时候,放置

位运算常用技巧总结(01)

基础知识 对于位运算,大家都很熟悉,基本的位操作有与(&&).或(||).非(!).异或(&)等等.在面试中经常会出现位运算相关的题,所以我就做了简单的整理,参考了很多写的很好的博客及书籍,在此一并谢过. 现在简单说一下,移位运算. 左移运算:x << y.将x左移y位,将x最左边的y位丢弃,在右边补y个0. 右移运算:x >> y.将x右移y位,这需要区分x是有符号数还是无符号数.在x是无符号数时,只需将x的最右边的y位丢弃,在左边补上y个0.在x是有符号

C++基础-位运算

昨天笔试遇到一道题,让实现乘法的计算方法,设计方案并优化,后来总结位运算相关知识如下: 在计算机中,数据是以1010的二进制形式存储的,1bytes = 8 bits,bit就是位,所以位运算就是对每个1010进行操作. 位运算有&|~^<<>>,分别是与或非异或左移右移. 与:1与不变,0与为0: 或:只有0或0为0,其他情况都为1: 非:取反: 异或:相同为0,不同为1: 左移右移:向左/右移动若干位: 乘法: 左移一位,相当于x2: 除法: 右移一位,/2; 不用申请

#C语言初学记录(位运算)

位运算 Problem Description7-1 数组元素循环右移问题 一个数组A中存有N(>0)个整数,在不允许使用另外数组的前提下,将每个整数循环向右移M(≥0)个位置,即将A中的数据由(A0 ??A?1?A?N?1)变换为(A?N?M?? ?A?N?1?? A?0?? A?1?? ?A?N?M?1?? )(最后M个数循环移至最前面的M个位置).如果需要考虑程序移动数据的次数尽量少,要如何设计移动的方法? 输入格式: 每个输入包含一个测试用例,第1行输入N(1≤N≤100)和M(≥0):

状压dp中常用的位运算式子

原址:状压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.’<<’符号

java位运算

Java的位运算(bitwise operators)直接对整数类型的位进行操作,这些整数类型包括long.int.short.char和 byte,位运算符具体如下表: 运算符 说明 << 左移位,在低位处补0 >> 右移位,若为正数则高位补0,若为负数则高位补1 >>> 无符号右移位,无论正负都在高位补0 & 与(AND),对两个整型操作数中对应位执行布尔代数,两个位都为1时输出1,否则0. | 或(OR),对两个整型操作数中对应位执行布尔代数,两个位

位运算心得

1.位运算 今天复习位运算的时候发现一个规律,之前都没有注意的,就是二进制和2的关系 2^0 = 0000 2^1 = 0010 2^2 = 0100 2^3 = 1000 后面的一次类推,可以很容易识别一个二进制的数和2的关系 二进制之间的运算也都可以换算成和2相关的运算,和2相关的乘法和除法直接可以转化成移位运算来解决 例如: 0010 + 0010 => 0010 * 2 => 0010 左移1位 => 0100 = > 2*2 = 4 0101 * 0100 = >