[转载]c++位运算介绍

转载 2012年03月31日 10:29:28

全文来源:http://www.cnblogs.com/mz121star/archive/2008/05/24/bit.html

 http://www.guigushi5.com/kongbumanhua/kongbumanhua_14057_3.html

不准备全文拷贝了,浪费资源啊

摘录一部分:

 

1. 使用按位与运算符

按位与运算符一般用于选择整数值中特定的一个位或一组位。为了说明这句话的含义,下面再次使用本节开头的例子,利用一个16位整数存储字体的特性。

假定声明并初始化一个变量,指定一种12磅字号、斜体、样式为6的字体。实际上,就是图3-1中的字体。样式的二进制值是00000110,斜体位是1,黑体位是0,字号是01100。还有一个没有使用的位,需要把font变量的值初始化为二进制数0000 0110 0100 1100。

由于4位二进制数对应于一个16进制数,因此最简单的方法是以十六进制方式指定初 始值:

unsigned short font=0x064C; // Style 6, italic, 12 point

注释:

在建立像这样的位模式时,十六进制表示法要比十进制表示法更合适。

要使用字号,需要从font变量中提取它,这可以使用按位与运算符来实现。只有当两个位都是1时,按位与运算符才会产生1,所以可以定义一个值,在将定义字号的位和font执行按位与操作时选择该位。为此,只需定义一个值,该值在我们感兴趣的位上包含1,在其他位上包含0。这种值称为掩码,用下面的语句定义它:

unsigned short size_mask=0x1F; //Mask is 0000 0000 0001 1111

//to select size

font变量的5个低位表示其字号,把这些位设置为1,剩余的位设置为0,这样它们就会被舍弃(二进制数0000 0000 0001 1111可转换为十六进制数1F)。

现在可以用下面的语句提取font中的字号了:

unsigned short size=font & size_mask;

在&操作中,当两个对应的位是1时,结果位就是1。任何其他组合起来的结果就是0。因此组合起来的值如下:

font 0000 0110 0100 1100

size_mask 0000 0000 0001 1111

font & size_mask 0000 0000 0000 1100

把二进制值分解为4位一组的形式并不是很重要,这只是易于表示对应的十六进制数,看出其中有多少位。掩码的作用是把最右边的5位分隔出来,这5位表示点数(即字号)。

可以使用同样的方法选择字体的样式,只是还需要使用按位移动运算符把样式值向右移动。可以用下面的语句定义一个掩码,选择左边的8位,如下所示:

unsigned short style_mask=0xFF00; //Mask is 1111 1111 0000 0000

//for style

用下面的语句获取样式值:

unsigned short style=(font & style_mask) >> 8; //Extract the style

该语句的结果如下:

font 0000 0110 0100 1100

style_mask 1111 1111 0000 0000

font & style_mask 0000 0110 0000 0000

(font & style_mask) >> 8 0000 0000 0000 0110

为表示斜体和黑体的位定义掩码,并把相应的位设置为1,就很容易把它们分隔出来。当然,还需要一种方式来测试得到的位,这部分内容详见第4章。

按位与运算符的另一个用途是关闭位。前面介绍的是掩码中为0的位在结果中也将输出0。例如,为了关闭表示斜体的位,其他的位不变,只需定义一个掩码,使该掩码中的斜体位为0,其他位为1,再对font变量和该掩码进行按位与操作即可。实现此操作的代码将在按位或运算符一节中介绍。

[转载]c++位运算介绍

位操作
  • yonghong1
  • yonghong1
  • 2010年11月12日 18:59
  • 399

C/C++中位运算杂谈

计算机中所有数据最终的存储形式均是二进制码。相信很多朋友和我一样,在大学中的课程中,很多课程前几章都会学习关于进制、原码、补码等东西。其实位运算是非常有用的。首要的一点,效率。位运算效率是非常高的,以...
  • sunbibei
  • sunbibei
  • 2015年12月01日 02:57
  • 1393

C++ 位运算总结

关于逻辑移位、算术移位可参见迅雷深大笔试题部分。的一道题。 以前看到C++标准上说,移位运算符(>)出界时的行为并不确定: The behavior is undefined if the...
  • zhang2531
  • zhang2531
  • 2016年09月09日 16:59
  • 2830

C/C++中的位运算(上)

本文转载自点击打开链接 C/C++中的位运算及其实例(1) 摘要 位运算是C/C++中的基本运算之一,即便是这样,它对大多数程序员来说是一个比较陌生的运算——大多数程序员很少使用位运算。本篇先...
  • qq_32400847
  • qq_32400847
  • 2016年03月07日 20:01
  • 1743

C++中位运算的使用方法

一:简介 1 位逻辑运算符:       & (位   “与”)  and       ^  (位   “异或”)       |   (位    “或”)   or       ~  (位   “取...
  • a1351937368
  • a1351937368
  • 2017年08月31日 14:57
  • 957

C++学习笔记-----用位运算实现加减乘除

数据在计算机内存中是以二进制存储的。 几种常用的位运算: 与运算&: 对应位均为1时为1,其它为0。 或运算|: 对应位均为0时为0,其它为1。 异或运算^: 对应位不相...
  • sinat_35261315
  • sinat_35261315
  • 2017年06月07日 23:11
  • 1624

位运算实现加法

思路: 考虑一个普通的加法计算:5+17=22 在十进制加法中可以分为如下3步进行:     1. 忽略进位,只做对应各位数字相加,得到12(个位上5+7=12,忽略进位,结果2);     2. ...
  • u010274071
  • u010274071
  • 2013年11月09日 00:05
  • 1131

来谈谈C++ 位运算 & | << >> ^ ~ %

老实说,我对+ = * / % && || ==一些比较简单的运算符比较熟悉。对位运算就陌生了,主要用的少。我觉得高手用的会比较多,因为位运算速度比较快。 1.& 如果两个相应的二进制位都为...
  • fox64194167
  • fox64194167
  • 2014年03月07日 20:43
  • 12473

位运算在算法题中的使用(C++)

一、算术运算符和位运算符 算术运算符:+、-、*、/、% 位运算符:&按位与、|按位或、^按位异或、~按位取反、>右移左侧补符号位、 >>>右移左侧补0 注意:移位运算一定要赋值。也就是说将a左移2位...
  • DjangoBUAA
  • DjangoBUAA
  • 2016年04月20日 14:36
  • 1734

枚举的位运算

using System; using System.Collections.Generic; using System.IO; using System.Linq; using System...
  • netcaoniao
  • netcaoniao
  • 2014年04月15日 15:21
  • 786
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:[转载]c++位运算介绍
举报原因:
原因补充:

(最多只允许输入30个字)