`
ze_nana
  • 浏览: 51495 次
社区版块
存档分类
最新评论

【位运算的用法】

 
阅读更多

【位运算符介绍】

C语言具有位逻辑运算和移位运算的独特功能,参与位运算的运算量必须是整数。位逻辑运算包括&(按位与)|(按位或)^(按位异或)~(取反)四种运算,移位运算有<<(左移)>>(右移)两种运算。其中~位单目运算符。

逻辑运算】

 & (按位与)】

参与运算的量,如果相对应的两位都为1,则该位的结果值为1,否则为0,即:

0&0==0       0&1==0      1&0==0     1&1==1

如:a的值为0x1234b的值为0x00a&b运算的结果c应为:

       a    0001   0010   0011   0100

      & b   0000   0000   1111   1111

       c    0000   0000   0011   0100

按位与常用于将某个运算量的某些位清0或提取某些位的值。

如上例子,将变量的高8位清0,同时保留或提取低8位的值,可用一个高8位为0,低8位为1的值0x00ff和它进行按位与。

 | (按位或)】

参与运算的量,如果相对应的两位都为0,则该位的结果值为0,否则为1,即:

0|0==0       0|1==1      1|0==1     1|1==1

如:a的值为0x1234b的值为0x00a|b运算的结果c应为:

       a    0001   0010   0011   0100

      |b    0000   0000   1111   1111

       c    0001   0010   1111   1111

    按位或常用于将某个运算量的某些位置1,如本例中将变量的低8位置1,高8位不变,可用一个高8位为0,低8位为1的值0x00ff和它进行按位或。

  ^ (按位异或)】

参与运算的量,如果相对应的两位相异,则该位的结果为1,否则为0,即:

00==0       01==1      10==1     11==0

如:a的值为0x1234b的值为0x00ab运算的结果c应为:

       a    0001   0010   0011   0100

     b    0000   0000   1111   1111

       c    0001   0010   1100   1011

    按位异或有“与1异或”该位翻转,“与0异或”该位不变的规律。如本例中用0x00ff进行按位异或,使变量a的低8位翻转,高8位不变。

 ~ (取反)】

将参与运算量的相对应位的值取反,即1001

如:a的值为0x1234,~a运算的结果c应为:

      a    0001   0010   0011   0100

      c    1110   1101   1100   1011

移位操作符】

 <<  (左移)】

按位左移是将一个运算量的各位依次左移若干位,低位补0,高位舍弃不要。

假设机器字长为8位,变量a的值为16,将a左移二位,即a=a<<2   

左移前   0001  0000     左移后   0100  0000

由此看出,左移一位相当于该数乘2,左移二位相当于乘4,即22,但这要以该数左移之后不“溢出”为前提。

所谓“溢出”指该数已超过机器字长所能容纳的范围,如该例若继续左移二位,该数为16× 24=256,超出了字长8位的表示范围(257),即产生了溢出。  

 >>  (右移)】

按位右移是将一个运算量的各位依次右移若干位,低位被移出,高位对无符号数补0,对有符号数要按最高符号位自身填补。

右移一位相当于该数除以2,但有可能带来误差。假设机器字长为8位,变量a值为15,将a右移二位,即a=a>>2    

右移前   0000  1111      右移后   0000  0011

如果a是带符号的负数,a=-16,存放在机器中的补码为1111  0000,则a=a>>2,值为- 4

右移前   1111  0000      右移后   1111  1100

 

移位操作可用于整数的快速乘除运算,左移一位等效于乘2,而右移一位等效于除以2

分享到:
评论

相关推荐

    位运算大师级使用方法---

    位运算大师级使用方法---位运算大师级使用方法---位运算大师级使用方法---位运算大师级使用方法---位运算大师级使用方法---位运算大师级使用方法---位运算大师级使用方法---位运算大师级使用方法---位运算大师级使用...

    位运算使用技巧

    位运算是一种直接对整数在内存中的二进制表示进行操作的方法。计算机内部所有的数据都以二进制形式存储,因此位运算能够直接作用于这些数据,从而实现快速高效的处理。 #### 二、位运算的应用场景 位运算的应用...

    使用位运算计算LOG2

    下面,我们将探讨使用位运算计算LOG2的方法。 首先,让我们了解什么是LOG2。LOG2是以2为底的对数函数,即LOG2(x) = y,当且仅当2^y = x时。换言之,LOG2(x)是x的对数,以2为底。 现在,让我们讨论如何使用位运算...

    lua进行位运算的文件,直接调用

    然后你可以像使用普通 Lua 函数一样调用其中定义的位运算方法,例如 `bit.band(a, b)` 对变量a和b进行按位与操作,`bit.bor(a, b)` 对它们进行按位或操作等。 在实际应用中,位运算可以用于各种场景,如内存优化、...

    位运算及其相关技巧在程序设计的应用

    此方法利用了XOR运算的特性,避免了传统交换方法中使用临时变量的开销。 #### 3.2 位运算在加密中的应用 XOR运算可以用于简单的数据加密,如通过与一个密钥进行XOR操作,使得原始数据变得不可读,而接收方只需再次...

    C语言中的位运算及其用法

    ### C语言中的位运算及其用法 #### 一、位运算概述 位运算是C语言中一种非常重要的操作,它直接对整数的二进制位进行操作。位运算符通常用于快速执行某些数学和逻辑操作,特别是在处理硬件级别任务时尤为有用。...

    回归本源——位运算及其应用

    摘自2014国家集训队论文《回归本源——位运算及其应用》,详细描述了位运算的众多巧妙用法,对于位运算的深入运用可以参考。

    基于位运算的两种字符串加密解密算法

    这两种方法都利用了位运算的高效性和简洁性,不仅能够实现字符串的加密解密,还能够在一定程度上节省内存空间,并提高程序执行速度。通过对这些算法的学习,可以帮助学生更好地理解和掌握位运算的概念及其实际应用。

    基于as3的位运算详解

    在AS3中,将浮点数转换为整数时,`int(x)`方法比直接使用位运算略快10%,但有时位运算在AS2中有更好的表现。例如,`x = 1.232 &gt;&gt; 0`会将浮点数转换为整数,保留其整数部分。 提取颜色组成成分是位运算的常见应用。...

    一个c语言 位运算 的程序

    本程序主要展示了如何在C语言中运用位运算来实现数据处理与转换的基本方法。位运算是指直接对二进制位进行操作的运算方式,在计算机科学中具有广泛的应用,尤其是在底层编程、算法优化等方面。 #### 描述:一个...

    ACM位运算技巧大全.doc(超级详细)

    - **乘法运算转换为位运算**:当乘数为2的幂时,可以直接使用位运算来替代乘法运算。 ```plaintext a * (2^n) 等价于 a ``` - **除法运算转换为位运算**:当除数为2的幂时,可以直接使用位运算来替代除法运算...

    C#枚举中的位运算

    本文将深入探讨C#枚举中的位运算,包括其基本概念、操作方法以及如何应用于权限管理。 首先,要理解位运算,它是计算机底层处理数据的基本方式,涉及到对二进制位的操作。常见的位运算有与(&)、或(|)、非(~)...

    位运算的妙用

    - **交换两数**: 传统交换两个数的方法是使用中间变量,但通过位运算也可以实现,如`a = a ^ b; b = a ^ b; a = a ^ b;`,利用异或运算的性质,使得a和b互换值。 - **变换符号**: 若要改变一个数的符号,可以使用...

    位运算教程

    总之,位运算在处理二进制数据方面非常高效,了解并掌握位运算的基本概念和使用方法对于编写高效程序是非常重要的。通过实际例子进行学习和练习,可以帮助加深对位运算原理的理解和应用能力的提升。

    易语言位运算实现加法运算

    在编程领域,位运算是一种底层且高效的计算方式,它直接操作二进制位...这种方法不仅适用于易语言,也适用于其他支持位运算的语言,如C、C++、Java等。学习和掌握位运算技巧,能够帮助你编写出更加高效和优化的程序。

    20191220-Java位运算_java_位运算_

    本文将深入讲解Java中的位运算,并通过雪花算法的应用实例来进一步阐述其重要性和用法。 1. **位运算概念** 位运算涉及到对整数类型(byte, short, int, long)的二进制表示进行操作。Java提供了六种基本的位...

    N皇后问题(位运算,C语言版)

    位运算是一种在计算机内部进行快速计算的方法,它利用二进制表示来进行加减乘除以及逻辑操作。在N皇后问题中,位运算主要用来表示棋盘的状态和检测冲突。 首先,我们可以用一个整数来代表棋盘的一行,其中每一位...

    十六进制字符串按位异或运算工具和java位异或运算

    在Java中,我们可以利用`Integer.parseInt()`方法将十六进制字符串转换为整数,再使用位运算符`^`来进行异或操作。首先,我们需要将输入的十六进制字符串按空格分隔,然后对每个分隔后的十六进制数进行异或运算。...

    logisim16位自动运算器

    实验报告——构建16位自动运算器 1. 实验目的 本次实验旨在让学生深入理解数字电路设计的基础,特别是运算器的设计与应用。通过使用Logisim软件,实验者需熟悉该平台的操作,掌握算术逻辑单元(ALU)的工作原理,...

    实验二 带进位控制8位算术逻辑运算实验.doc

    在本实验中,我们将使用8位算术逻辑运算单元来进行实验,了解带进位控制的原理和实现方法。实验步骤包括实验原理的介绍、实验接线文字说明、实验步骤和实验结果分析等。 实验目的: * 了解8位算术逻辑运算单元的...

Global site tag (gtag.js) - Google Analytics