位运算(转)

12 位运算

  C语言是为描述系统设计的,因此它应该具有汇编语言所以完成的一些功能。C语言既有高级语言的特点,又具有低级语言的功能。因而具有广泛的用途和很强的生命力。

12.1 位运算符和位运算

运算符  含义

&    按位与

|    按位或

^    按位异或

~    取反

<<   左移

>>   右移

说明:

(1)位运算符中除 ~ 外,均为二目运算符,即要求出侧各有一个运算量。

(2)运算早只能是整型或字符型的数据,不能为实型数据。

12.1.1 按位与运算符 &

  参加运算的两个数制,按二进制进行 与运算。如果两个相应的二进位数为1,刚该位的结果为 1 否则为 0 即:

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

例如:3 & 8 并不等于8,应该是按位与

3 = 00000011

5 = 00000101 &

00000001

  因此 3 & 5 的值得 1, 如果参加 & 是负数(-3 & -5),则以补码形式表示为二进制数。然后按位进行 与 运算。

  按拉与有一些特殊的用途:

  (1)清零。如果想将一个单元清零,即使其全部二进位为 0,只要找一个二进制数,其中各个位符合以下条件:原来数中为 1 的位,新数中相应位为 0。然后使二者进行 & 运算,即可以达到清零目的。

  (2)取一个数中某些指定位。如有一个整数 a (2个字节)想要其中的低字节。只需将 a 与(337)。按位与即可。

  (3)要想将哪一个保留下来,就与一个数进行 & 运算,此数在该位位1,如有一个数 01010100,想把其中左面第3,4,5,7,8可以这样运算:

01010100

00111011 &

00010000

12.1.2 按位或运算符 |
  两个相应的二进位中只要有一个为 1,该位的结果就为 1。

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

  按位或运算常用来对一个数据的某些位定值为1,如 a 是一个整数(16位)有表达式 a & 0377,则低 8 位全置为 1。高 8 位保留原样。

12.1.3 异或运算符 ^

  异或运算符 ^ 也称 XOR 运算符。它的规则是若参加运算的两个二进位同号,则结果为0,异号则为1。即 0^0=0; 0^1=1; 1^0=1;1^1=0;

下面举例说明 ^ 运算符的应用。

  (1)使特定位翻转

  假设有 01111010,想使其低4 位翻转,即 1 变为 0,0 变为 1,可以将它与 00001111进行 ^ 运算,即

01111010

00001111 ^

01110101

结果值的低 4 位正好是原数低4位的翻转。

  (2)与 0 相 ^ 保留原值

如 012 ^ 00 = 012

00001010

00000000 ^

00001010

因为原数中的 1 与 0 进行 ^ 运算得 1,0 与 1 运算得 0,故保留原数。

  (3)交换两个值,不用临时变量

  假如 a = 3, b = 4。想将 a 和 b 的值互换,可以用以下赋值语句实现:

  a = a ^ b;

  b = b ^ a;

  a = a ^ b;

a = 011

b = 100 //a = a ^ b;

a = 111//a = 7

b = 100 //b = b ^ a;

b = 011// b = 3

a = 111//a = a ^ b;

a = 100 // 4

12.1.4 取反运算符 ~

  ~是一个头单目运算符,用来对一个二进制按位取反,即将 0 变 1,1变 0。例如~25 是对八进制数 25 (即 00010101)按位取反。

00000000 00010101

11111111 11101010 ~

  ~运算符的优先级别比算术运算符,关系运算符,逻辑运算符和其它运算符都高,例如:~a & b,先进行 ~a 然后进行 & 运算。

12.1.5 左移运算符 <<

  用来将一个数各二进位全部左移若干位。例如:

  a = a << 2;

将 a 的二进制数左移 2 位,右补 0,若 a = 15,即二进制数 00001111,左移2位得到 00111100,即十进制数60.

  高位左移后溢出,舍弃不起作用。

  左移一位相当于该数乘以2。但些结论只适用于该数左移时被溢出舍弃的高位中不包含1 的情况。

  左移比乘法运算快得多,有些C编译程序自动将乘2的运算用左移来实现。

12.1.6 右移运算符 >>

  a >> 2 表示将 a 的各二进位右移 2 位。移到右端的低位被舍弃,对无符号数,高位补 0。如 a = 017 时:

a = 00001111 >> 2

00000011

  右移一位相当于除以 2 ,右移 n 位相当于除于 2^n。

  在右移时,需要注意符号位问题。对无符号数,右移时左边高位移入 0。对于有符号的值,如果原来符号位为 0 (该数为正),则左边也是移入 0,如果上例表示的那样,如果符号位原来为 1(该数为负),则左边移入的 0 还是 1 ,要取决于所用的计算机系统。移入 0 称为 逻辑右移,即简单右移。移入 1 称为 算术右移。

12.1.7 位运算赋值运算符

  位运算符与赋值运算符可以组成复合赋值运算符。

  如:&=, |=, >>|, <<=, ^=

12.1.8 不同长度的数据进行位运算

  如果两个数据长度不同(例如 long 型和 int 型)进行位运算时(如 a & b 而 a 为 long型,b 为 int 型),系统会将二者按右端对齐。如果 b 为正数,则左侧 16 位补满 0。若 b 为负数,左端应补满 1。如果 b 为无符号整数型,则左侧补满 0。

12.2 位运算举例

  取一个整数 a 从右端开始的 4~7 位

  (1)先使 a 右移 4 位

  a >> 4;

  (2)设置一个低 4 位全为 1 ,其余全为 0 的数,可以用下面方法实现:

  ~(~0<<4)

~0 的全部二进制为 1 ,左移 4 位,这样右端低 4 位为 0。

  (3)将上面二者进行 & 运算。

  a >> 4 & ~(~0<<4)

来源:http://www.cnblogs.com/qkhhxkj/archive/2011/06/29/2093894.html

时间: 2024-10-21 18:44:42

位运算(转)的相关文章

位运算

位运算的实际应用场景 http://blog.csdn.net/zmazon/article/details/8262185

POJ 1781 In Danger Joseph环 位运算解法

Joseph环,这次模固定是2.假设不是固定模2,那么一般时间效率是O(n).可是这次由于固定模2,那么能够利用2的特殊性,把时间效率提高到O(1). 规律能够看下图: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQva2VuZGVuMjM=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" > 具体具体解析请看大师Knuth的Concrete m

位运算总结&amp;拾遗

JavaScript 位运算总结&拾遗 最近补充了一些位运算的知识,深感位运算的博大精深,此文作为这个系列的总结篇,在此回顾下所学的位运算知识和应用,同时也补充下前文中没有提到的一些位运算知识. 把一个数变为大于等于该数的最小的2的幂 一个数为2的幂,那么该数的二进制码只有最高位是1. 根据这个性质,我们来举个栗子,比如有数字10,转为二进制码后为: 1 0 1 0 我们只需把 0 bit的位置全部用1填充,然后再把该二进制码加1就ok了.而x | (x + 1)正好可以把最右边的0置为1,可是

Java I/O : Bit Operation 位运算

Writer      :BYSocket(泥沙砖瓦浆木匠) 微         博:BYSocket 豆         瓣:BYSocket FaceBook:BYSocket Twitter    :BYSocket 泥瓦匠喜欢Java,文章总是扯扯Java. I/O 基础,就是二进制,也就是Bit. 一.Bit与二进制 什么是Bit(位)呢?位是CPU处理或者数据存储最小的单元.类似于很小很小的开关,一开一关,表示为1或者0.所以,这就是计算机处理任何数据的"细胞",要谨记.

mysql位运算

1.MOD(X1,X2) 求余运算,返回余数同"%" 2.X1 DIV X2 除法运算返回商,同"/" 3.如果除数为0,那么结果为NULL. 4.<=>和= 是一样的,也是用来判断操作数是否相等的.不同的是<=>可以用来判断null,=不能判断null. 例:select null<=>null 结果1 逻辑运算符 1.与&&或and:所有操作数不为0且不为null时,结果为1,任何一操作数为0,结果为0,存在一

位运算之 C 与或非异或

位运算比较易混: 位运算之 C 与或非异或 与运算:& 两者都为1为1,否则为0 1&1=1,  1&0=0,  0&1=0,  0&0=0 或运算:| 两者都为0为0,否则为1 1|1 = 1,  1|0 = 1,  0|1 = 1, 0|0 = 0 非运算:~ 1取0,0取1 ~1 = 0, ~0 = 1 ~(10001) = 01110 异或运算:^ 两者相等为0,不等为1(易混淆) 1^1=0, 1^0=1, 0^1=1, 0^0=0 位移操作符:<&

Java的位运算

左移位操作 左移位运算的符号为[<<],左移位运算符左面的操作元称作被移位数,右面的操作数称作移位量. 左移位运算是双目运算符,操作元必须是整型类型的数据,其移动过程是:[a << n]运算的过程是通过将a的所有位都左移n位,每左移一个位,左边的最高位上的0或1被移出丢弃,并用0填充右边的低位 注意: 如果a是byte.short或int型数据,总是先计算出n%32的结果m,然后进行a<<m运算 对于long型数据,总是先计算出n%64的结果m,然后进行a <&l

常见的位运算

位运算主要有:|   &   ^    ~ & 这个是只要有0,则0 | 这个只要有1,则1 ^异或运算,只要不同则为1 ~全部相反 参与位运算首先要将数值化作为二进制补码,方可参与运算 >>                                               >>>                                << 有符号右移                                无符号右移   

C位运算笔记(根据网上内容整理)1

什么是位运算?    程序中的所有数在计算机内存中都是以二进制的形式储存的.位运算说穿了,就是直接对整数在内存中的二进制位进行操作.由于位运算直接对内存数据进行操作,不需要转成十进制,因此处理速度非常快. 各种位运算的使用 === 1. and运算 ===(同真为真) and运算通常用于二进制取位操作,例如一个数 and 1的结果就是取二进制的最末位.这可以用来判断一个整数的奇偶,二进制的最末位为0表示该数为偶数,最末位为1表示该数为奇数. === 2. or运算 ===(一真为真) or运算通

位运算和关于两个数交换的多种方法

我们知道,位运算在计算中有着广泛的应用. 在计算机的各种编程语言中位运算也是一种不可缺少的运算,尤其是在计算机的底层实现代码中. 以下我们就来介绍一下位运算. 1.左移运算<<  左移右移都是移动二进制数 0000-0000 0000-0000 0000-0000 0000-1100     =12 向左移动一位变为(右边缺几位就补几个0) 0000-0000 0000-0000 0000-0000 0001 1000       =24 再向左移一位 0000-0000 0000-0000