位运算的使用和一些技巧

位运算有以下几种:~ & ^ |,为 按位取反 按位与 按位异或 按位或,优先级从左到右依次降低。

按位与运算有两种典型用法,一是取一个位串信息的某几位,如以下代码截取x的最低7位:x & 0177。二是让某变量保留某几位,其余位置0,如以下代码让x只保留最低6位:x = x & 077。

按位或运算的典型用法是将一个位串信息的某几位置为1。如将要获得最右4位为1,其他位与变量j原来其他位保持相同,可用逻辑或运算017|j;

按位异或运算的典型用法是求一个位串信息的某几位信息的反。如欲求整型变量j的最右4位信息的反,用逻辑异或运算017^j,就能求得j最右4位的信息的反,即原来为1的位,结果是0,原来为0的位,结果是1。 异或运算在解一些问题时特别有用。 具体异或有如下性质: 0 ^ x = x, 1 ^ x = ~x。

异或的最常用例子就是运用x^x = 0 这个性质。如交换两个值,不允许用临时变量,该如何解决。

解:假设a = 3, b = 5。 则 可用如下三个等式完成: a = a ^ b, b = a ^ b, a = a ^ b.   三个语句完成后a和b数值交换。

时间: 2024-11-05 17:17:54

位运算的使用和一些技巧的相关文章

位运算 使用技巧

位运算简介及实用技巧(一):基础篇 什么是位运算? 程序中的所有数在计算机内存中都是以二进制的形式储存的.位运算说穿了,就是直接对整数在内存中的二进制位进行操作.比如,and运算本来是一个逻辑运算符,但整数与整数之间也可以进行and运算.举个例子,6的二进制是110,11的二进制是1011,那么6 and 11的结果就是2,它是二进制对应位进行逻辑运算的结果(0表示False,1表示True,空位都当0处理): 110 AND 1011 ---------- 0010  -->  2 由于位运算

位运算简介及实用技巧(一):基础篇[转]

位运算简介及实用技巧(一):基础篇 原贴链接:http://www.matrix67.com/blog/archives/264 去年年底写的关于位运算的日志是这个Blog里少数大受欢迎的文章之一,很多人都希望我能不断完善那篇文章.后来我看到了不少其它的资料,学习到了更多关于位运算的知识,有了重新整理位运算技巧的想法.从今天起我就开始写这一系列位运算讲解文章,与其说是原来那篇文章的follow-up,不如说是一个remake.当然首先我还是从最基础的东西说起. 什么是位运算?    程序中的所有

位运算简介及实用技巧(二):进阶篇(1)[转]

位运算简介及实用技巧(二):进阶篇(1) 原贴链接:http://www.matrix67.com/blog/archives/264 =====   真正强的东西来了!   ===== 二进制中的1有奇数个还是偶数个    我们可以用下面的代码来计算一个32位整数的二进制中1的个数的奇偶性,当输入数据的二进制表示里有偶数个数字1时程序输出0,有奇数个则输出1.例如,1314520的二进制101000000111011011000中有9个1,则x=1314520时程序输出1.var   i,x,

(转)位运算简介及使用技巧

转自http://www.matrix67.com/blog/archives/263 去年年底写的关于位运算的日志是这个Blog里少数大受欢迎的文章之一,很多人都希望我能不断完善那篇文章.后来我看到了不少其它的资料,学习到了更多关于位运算的知识,有了重新整理位运算技巧的想法.从今天起我就开始写这一系列位运算讲解文章,与其说是原来那篇文章的follow-up,不如说是一个remake.当然首先我还是从最基础的东西说起. 什么是位运算?    程序中的所有数在计算机内存中都是以二进制的形式储存的.

位运算应用技巧

非常有用的位运算技巧 一提起位运算,人们往往想到它的高效性,无论是嵌入式编程还是优化系统的核心代码,适当的运用位运算总是一种迷人的手段,或者当您求职的时候,在代码中写入适当的位运算也会让您的程序增加一丝亮点,最初当我读<编程之美>求"1的数目"时,我才开始觉得位运算是如此之美,后来读到 <Hacker's Delight>,感慨到Henry S.Warren把位运算运用的如此神出鬼没,很多程序都十分精妙,我觉得在一个普通的程序中大量运用这样的代码的人简直是疯了!

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

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

ACM中的位运算技巧

听说位运算挺好玩的,那这节总结一下ACM中可能用到的位运算技巧.(可能更新) XOR运算极为重要!!(过[LC136](只出现一次的数字 - 力扣(LeetCode)):数组中每个数字都出现两次,只有一个出现一次,找到出现一次的数字) 1. 如果我们对 0 和二进制位做 XOR 运算,得到的仍然是这个二进制位a⊕0=a2. 如果我们对相同的二进制位做 XOR 运算,返回的结果是 0a⊕a=03. XOR 满足交换律和结合律a⊕b⊕a=(a⊕a)⊕b=0⊕b=b <<一次相当于*2,>&g

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

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

mysql位运算的应用

在mysql中,如果某条数据与其它数据存在一对多的关系,一般我们很自然的就会想到建立一个关系表.例如有一个景点信息的数据表,其结构如下: id int(主键) name varchar(景点名) province int(省份) city int(城市) 每个景点包含很多属性,例如适合旅游的月份,我们一般的做法可能有两种:一种是增加一个varchar字段,每个月份之间用一个特殊符号分隔保存,例如“1,2,3,11,12”:另一种方法是建立一个关系表,如下: spots_id int(景点ID)