`

位运算的基本操作以及实例介绍

阅读更多
谈到位运算,有些人可能感觉位运算很容易出错,但是位运算可以解决很多问题,所以我们有必要掌握位运算的知识,并能用位运算解决问题。

首先我们熟悉一下位运算的基本操作符(java):
^ (xor) 代表异或,~(not)代表取非,&(and) 代表按位与,|(or)代表按位或
>> 代表右移, << 代表左移,>>>代表无符号右移(用0填充左边的空位)

知道了基本的运算符,我们先看几个小的例子:

1. 0110+0110
在这个例子中,两个相同的数相加,相当于0110*2, 所以我们把0110左移一位就可以了(0110<<1),结果是1100。

2. 0100*0011
因为0100相当于4,相当于2的平方,所以我们把0011左移两位就可以了,结果是1100。

3. 1101^(~1101)
如果我们按位运算它结果是1111,我们可以发现任何一个数异或它本身的非时(a^(~a)),结果是一个1s(1s代表一个1的序列,下面都用1s表示)。

4. 1011&(~0<<2)
这个例子的结果是1000。通过这个例子我们可以总结出一个数x和(~0 << n)进行按位与操作,x的最右边的n为将变为0的序列,换句话说我们清除了x最右边的n位。

通过上面简单的例子我们得到下面的一些基本用法 (0s代表一个全为0的序列):
1.  ^ 异或
x ^ 0s = x
x ^ 1s = ~x
x ^ x = 0

2. & 位与
x & 0s = 0;
x & 1s = x;
x & x = x

3. | 按位或
x | 0s = x
x | 1s = 1s;
x | x = x;

4. x & (1 << n) (得到特定位)
1左移n位后我们得到一个类似于00001000的序列,所以通过这个例子我们把x所有位置0除了第n位,从而我们得到了第n位。

5. x | (1 << n) (设置特定位)
同第四个例子,1左移n位后我们得到一个类似于00001000的序列,x按位或00001000后我们能改变第n位,把她设置为1,x中其它位不会受到影响。

6. x & (~ (1 << n)) (清除特定位)
1左移n位后我们得到一个类似于00001000的序列,然后取非,得到11110111,x按位与11110111后我们只把第n位置0,其它位不会改变。类似的还有x &( (x << n) - 1) 和x &(~(-1 >>>(31 - i)))

7. (x & (~(1 << n))) | (y << n) (把x的第n位设置成y)
首先我们把x的第n位设置成0,然后把y左移n位得到一个第i位为y,其余位为0的序列,把这两个数位或就把x的第n位设置成了y。

很多复杂的问题都可以通过这些基本的操作解决。在这里仅仅举几个简单的例子,对于很多题目都可以用位运算解决,希望大家善于思索, 感受位运算的魅力。
1. 给定两个整数 a, b, 如果不用第三个变量, 怎样将两个数的数值交换?

当然我们可以用其他方法解决,但如果我们在面试中用位运算来解决一个问题,也许会让面试官眼前一亮,这道题我们可以用异或来解决。
首先我们令a = a ^ b; 然后b = a ^ b, 相当与 b = a ^ b ^ b = a ^ 0 = a; 最后我们令 a = a ^ b, 此时b = a, 也就是 a = a ^ b ^ a = b。从而完成了两个值的交换。

2. 给定两个整数A, B,写一个方法确定需要几次换位才可以将A变为B。
比如 A: 11010  B: 01100  输出:3

我们首先要知道那些位需要替换,我们很容易想到异或这个功能,A^B,相同的位异或为0,不同的位异或为1,所以我们只需要确定异或之后的数有几个1即可。我们怎么确定呢?上面讲到了如何清除特定位,这里是个特例,例如A^B = x, 我们让x&(x-1),这个操作清除了x最右边的1,我们通过一个循环确定次数,直到x为0结束。代码如下:
public int bitSwapNums(int a, int b) {
		int count = 0;
		for(int i = a ^ b; i > 0; i= i & (i - 1)){
			count ++;
		}
		return count;
}


位运算的应用很灵活,我们也可以这样实现
public int bitSwapNums(int a, int b) {
                int count = 0;
		for(int i = a ^ b; i > 0; i = i >> 1) {
			count += i & 1;
		}
		return count;
}


每次循环i右移一位,通过与1进行位与得到1的个数。

分享到:
评论

相关推荐

    Vue入门之数量加减运算操作示例

    主要介绍了Vue入门之数量加减运算操作,结合实例形式分析了vue.js基本数值运算相关操作技巧,需要的朋友可以参考下

    Opencv的基本矩阵操作与实例

    介绍了Opencv中的基本矩阵运算函数和使用方法,并给出了实例。

    C#开发实例大全(基础卷).软件开发技术联盟(带详细书签) PDF 下载

    主要内容有C#开发环境的使用、C#语言基础应用、字符串处理技术、数组和集合...基本操作、文件夹基本操作、文件流操作、加密、解密及解压缩文件、C#与Word互操作、高效应用Excel、基本图形绘制、图像处理技术、常用图表...

    计算器类,实现四则运算

    计算器类: 设计一个计算器类模板,适用各类型表达式的“+、-、×、/” 数学四则运算以及“&gt;、&gt;=、&lt;、、!=、==”等关系运算。数学四则运算表达式中可含有加、减、乘、除运算符以及各型数据的运算对象。程序可以直接...

    一个计算器的设计具有基本的加、减、乘、除等四则运算

    生成一个简单的计算器界面,添加事件处理的功能,实现基本的加、减、乘、除运算。(使用AWT或者Swing都可以)按照Java图形用户界面的设计要求,完成一个计算器的设计。要求具有基本的加、减、乘、除等四则运算。要求...

    c语言经典源码例子100篇

    实例5 普通位运算 实例6 位移运算 实例7 字符译码 实例8 指针操作符 实例9 if判断语句 实例10 else-if语句 实例11 嵌套if语句 实例12 switch语句 实例13 for语句 实例14 while语句 实例15 do-while语句 实例16 break...

    Java初级实例:基本数据类型及操作代码.rar

    JAva基本的数据类型和基本操作相关源代码打包,像一些标识符、变量、赋值语句和赋值表达式、算术运算符、数值类型转换、字符数据类型及其运算、特殊字符的转义序列表示、字符型char数据与数值型数据之间的转换、从...

    Java基本数据类型及操作相关实例

    内容索引:Java源码,初学实例,初学实例 JAva基本的数据类型和基本操作相关源代码打包,像一些标识符、变量、赋值语句和赋值表达式、算术运算符、数值类型转换、字符数据类型及其运算、特殊字符的转义序列表示、字符...

    PHP开发实战1200例(第1卷).(清华出版.潘凯华.刘中华).part2

    实例052 使用位运算对数字进行加密和解密 83 2.3 包含语句 84 实例053 提高代码重用率 84 实例054 包含数据库连接文件 85 实例055 包含网站头文件 86 实例056 包含网站尾文件 87 实例057 包含网站的主文件 88 2.4 ...

    组成原理运算方法

    组成原理运算方法 基本算术运算的实现 定点加减运算 带符号数的移位和舍入操作 定点乘法运算 定点除法运算 规格化浮点运算 十进制整数的加法运算 逻辑运算与实现 运算器的基本组成与实例

    opencv Mat add divide 运算

    opencv 中关于 mat 矩阵的基本运算操作,有实例和注释,可以方便查看结果

    完整详细的汇编语言实验报告

    完整详细的汇编实验报告 1、用Debug命令查看寄存器和内存中的内容 2、不同寻址方式的灵活...(1)多数位的算术运算、移位操作、字符串操作等程序的设计 (2)学习使用分支与循环等基本编程方法 (3)熟练使用Debug。

    MATLAB 实例教程 贾秋玲 西北工业大学

    MATLAB 实例教程 贾秋玲 西北工业大学 第一章对MATLAB做简单的介绍;第二章介绍MATLAB的基本 操作,包括数值及变量、赋值语句、常用数学函数及MATLAB语言中的关系与逻辑运算;第 三章内容为数组与矩阵的运算;第四章...

    数据结构学习--线性表及其应用--顺序表

    在众多数据结构当中,线性表是最简单、也是最...本实验相对比较简单,通过本实验,对顺序表基本操作及 其组合应用的演练,加深对线性表顺序存储方法及其基本操作的理解,为以后进一步学习更 复杂的数据结构打下基础。

    熟悉Matlab环境及基本操作

    1.启动Matlab,说明主窗口、命令窗口、当前目录窗口、工作空间窗口、历史窗口、...3.实例操作向量、矩阵的定义、生成方法和基本运算。 4.实例操作Matlab的基本符号运算。 5.实例操作Matlab中的二维图形绘制和控制。

    C# 线性表使用实例

    定义接口,在泛型类中实现了线性表中的各种操作,包含增、删、改、查等。通过本实例,可以学习C#线性表相关内容,也可以学习到接口、类、泛型、索引器等相关知识,为下一步数据结构的学习打下坚实的基础。

Global site tag (gtag.js) - Google Analytics