`
javababy1
  • 浏览: 1165480 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

C/C++ 位操作符使用

 
阅读更多

本章小结:

1.掩码

就是一串2进制 对目标字段进行位与运算,屏蔽当前的输入位。

将源码与掩码经过逻辑运算得出新的操作数。其中要用到逻辑运算如OR运算。AND运算。用于如将ASCLL码中大写字母改作小写字母。

2. 异或 转换成补码运算

3.用法:掩码 &

4. 用法:打开位 |

5.用法:关闭位 &~

6.用法:转置位 ^

7. Value的第bit_number位置1 Value |= 1 << bit_number;

8. Value的第bit_number位置0 Value &= ~( 1 << bit_number );

9.value & 1 << bit_number 如果该位置已被置为1,则表达式的结果为非零值

C/C++提供位逻辑运算符移位运算符。二者只能用于整形和字符型。位运算符是对每位进行操作而不影响左右两位,这有别于常规运算符(&&||!)是将整个数进行操作的。

一.位逻辑运算符

1~按位取反

1变为0,将0变为1

EG

~(10011010)

(01100101)

注:

VC++编译器,计算~10,得出的结果是-11。为什么不是5

10的二进制表示为1010,按位取反应该为0101,也就是十进制的5,为什么会得出-11

VC32位编译器,所以

10=00000000000000000000000000001010

~10=11111111111111111111111111110101=-11

可以通过掩码(位与)15位与

15=00000000000000000000000000001111

~10=00000000000000000000000000000101=-11

2&按位取与

只有两个操作数都是1结果才是1,否则为0

10=00000000000000000000000000001010

12=00000000000000000000000000001100

&

8=00000000000000000000000000001000

3|按位取或

两个操作数任意一位为1结果就是1

10=00000000000000000000000000001010

12=00000000000000000000000000001100

|

14=00000000000000000000000000001110

4^按位异或

两个操作数不同为1,相同为0

10=00000000000000000000000000001010

12=00000000000000000000000000001100

^

14=00000000000000000000000000000110

5用法:掩码

掩码是通过&(位与)将某些位设置为开(1),将某些位设置为关(0)。将掩码0看做不透明,将1看着透明。

EG

如只显示第二、三位

107=0110 1011

6=0000 0110

&

2=0000 0010

6用法:打开位

打开位是通过|(位或)打开一个值的特定位,同时保持其他位的不变。这是因为和0位或都为0,和1位或都为1

EG

如只打开第二、三位

107=0110 1011

6=0000 0110

|

111=0110 1111

7用法:关闭位

关闭某些位

EG

如关闭第二、三位

107=0110 1011

6=0000 0110

& ~

105=0110 1001

8用法:转置位

如果一位为1则转置为0,如果一位为1则转置为0

EG

如转置第二、三位

107=0110 1011

6=0000 0110

^

105=0110 1101

二.移位运算符

  1. <<左移

左移运算符是把操作数的值的每一位向左移动,移动的位数有右边的操作数决定,右侧空出的位数用0填充

EG

如转置第二、三位

107=0110 1011 <<2

<<

172=1010 1100

在计算机中由于是32位的

107=0000 00000000 00000000 00000110 1011 <<2

<<

428=0000 00000000 00000000 00011010 1100

  1. >>右移

右移运算符是把操作数的值的每一位向右移动,移动的位数有右边的操作数决定,左边丢弃的位数用0填充

EG

如转置第二、三位

107=0110 1011 >>2

>>

26=0001 1010

    一、传统的C方式位操作:

    1.基本操作:

    使用一个unsigned int变量来作为位容器。

    2.操作符:

    | 按位或操作符:result=exp1|exp2;exp1exp2中对应位中至少有一个为1时,result中对应位为1,否则为0

    &按位与操作符::result=exp1&exp2;exp1exp2中对应位全为1时,result中对应位为1,否则为0

    ^ 按位异或或操作符:result=exp1^exp2;exp1exp2中对应位不相同时,result中对应位为1,否则为0

    ~ 反转操作符:将位容器中的所有位都反转,1变为00变为1

    << 按位左移操作符:exp<<n,将容器中所有的位向左移n位,空出的位用0填充。

    >> 按位右移操作符:exp>>n,将容器中所有的位向右移n位,空出的位用0填充。

    |=,&=,^= 分别对应|&^三种操作符的复合操作符。

    3.常用操作

    这里我们假设有一个resultunsigned int变量用来储存32个学生的成绩(通过和不通过分别用01),这样result就有33位(result从右至左,从0开始计算位数,在这个例子中0位被浪费)。

    (a) 将第27位设置为及格(设作1)其他位不变:

    result|(1<<27) //任意的位值与1作按位或操作其值为1,而与0作按位与操作其值不变

    (b) 将第27位设置成不及格(设为0)。

    result&=~(1<<27) //任意的位值与0作按位与操作其值为0,而与1作按位与操作其值不变

    (c) 反转第27位的值。

    result^=(1<<27) //任意的位值与1作按位异或操作其值为1,而与0作按位异与操作其值不变

    二、C++中的bitset容器

    1.头文件:

    #include <bitset>

    2.声明一个容器:

    (a)声明一个指定位数的空容器(所有位设为0: bitset<int> bits;

    (b)声明一个指定位数并将指定的几个位初始化为相应值的容器: bitset<n> bits(int);

    bitdet<int> bits(string&)

    总结:bitset模板类中类型参数传递容器的位数,而构造函数参数通过一个int或一个string&值来从右至左初始化容器中的相应值。

    3.bitset的基本用法:

    操作

    功能

    用法

    test(pos)

    pos位是否为1?

    a.test(4)

    any()

    任意位是否为1?

    a.any()

    none()

    是否没有位为1?

    a.none()

    count()

    值是1的位的小数

    count()

    size()

    位元素的个数

    size()

    [pos]

    访问pos

    a[4]

    flip()

    翻转所有位

    a.flip()

    flip(pos)

    翻转pos

    a.flip(4)

    set()

    将所有位置1

    a.set()

    set(pos)

    pos位置1

    a.set(4)

    reset()

    将所有位置0

    a.reset()

    reset(pos)

    pos位置0

    a.reset(4)

    4.bitset与传统C位操作及字符串的转换

    可以通过to_string()成员将容器转输出为一个string字符串,另外还可以用to_long()成员将容器输出到传统的用于C风格的位容器中。如:

    unsigned long bits = bits.to_long();

    sting str(bits.to_string());

分享到:
评论

相关推荐

    C/C++程序员面试指南.杨国祥(带详细书签).pdf

    面试题3:流操作符重载为什么返回引用 5.2 指针 面试题4:说明以下声明的含义 面试题5:简述指针常量与常量指针区别 面试题6:写出以下代码的输出结果 面试题7:找出代码的错误 5.3 指针和数组 面试题8:写出代码的...

    C++/C编程规范

     本书涵盖了C++程序设计的每一个方面,包括设计和编码风格、函数、操作符、类的设计、继承、构造与析构、赋值、名字空间、模块、模板、泛型、异常、STL容器和算法等。书中对每一条规范都给出了言简意赅的概述,并...

    c/c++ 学习总结 初学者必备

     \xhh(最多两位)十六进制符 下面的代码输出是什么,为什么? 1、sizeof()和strlen()的使用? 答: 1.从功能定义上,strlen函数,用来求字符串的长度,sizeof函数是用来求指定变量或变量类型等所占用内存的 大小;...

    C/C++面试题目及解答.doc

    用C/C++语言写一函数完成该算法,给出复杂度 &lt;br&gt;6.对序列1、1、2、3、5、8、13。。。。 是Fab..数列 2、3、5、13...是Fab..质数数列,因为他们与自己前面的Fab...数列都互质 给出k,返回第k小的...

    77G 22套C语言 C++ 数据结构 程序设计视频课程合集 C丨C++相关学习视频全套视频教程

    MCU51_位操作运算符.mp4 MCU51_分支控制.mp4 MCU51_循环控制.mp4 MCU51_编译预处理.mp4 MCU_51_一维数组.mp4 MCU_51_二维数组.mp4 MCU_51_函数概述.mp4 MCU_51_字符数组.mp4 MCU_51_局部变量和全局变量.mp4...

    C++高精度整型对象实现

    C/C++基本类型做算术运算时长度有限,但也...本资源用C++封装了一个高精度整型,完整重载了+-*/%==&gt;&gt;等操作符, 可以直接当整型使用于工程项目,包含了功能测试和性能测试程序,在vs 2019、及ubuntu gcc 均能编译运行。

    C++ Primer第四版【中文高清扫描版】.pdf

    5.3 位操作符 134 5.3.1 bitset对象或整型值的使用 135 5.3.2 将移位操作符用于IO 137 5.4 赋值操作符 137 5.4.1 赋值操作的右结合性 138 5.4.2 赋值操作具有低优先级 138 5.4.3 复合赋值操作符 139 5.5 自增和自减...

    详解C++ cout格式化输出完全攻略

    写算法题的时候突然发现自己忘记...C++ 中的 cout 对象则使用流操作算子(你也可以叫做格式控制符)或者成员函数进行控制。 使用流操作算子 C++ 中常用的输出流操纵算子如表 1 所示,它们都是在头文件 iomanip 中定义的

    非常经典的c++ primer视频教程6-10

    5.3 位操作符 5.3.1 bitset对象或整型值的使用 5.3.2 将移位操作符用于IO 5.4 赋值操作符 5.4.1 赋值操作的右结合性 5.4.2 赋值操作具有低优先级 5.4.3 复合赋值操作符 5.5 自增和自减操作符 5.6 箭头操作符...

    c++语言介绍.ppt

    C++源于C语言。 1970年,两位程序员Brian Kernighan和Dennis Ritchie首创了一种新的程序设计语言,取名为C语言。...函数名重载与操作符重载 动态存储分配 友元函数与内联函数 结构、联合与类

    Visual C++/Turbo C串口通信编程实践及源代码-3

    Visual C++/Turbo C串口通信编程实践及源代码 第1章 轻松体验串口通信编程与调试 1 1.1 使用串口调试助手来体验串口通信 1 1.2 体验windows环境下的visual c++串口通信编程 4 1.3 体验dos环境下turbo c串口通信...

    C语言解析教程(原书第4版)(美) 凯利.pdf

    第7章 位操作符和枚举类型 7.1 位操作符和表达式 7.1.1 按位求反 7.1.2 补码 7.1.3 位逻辑操作符 7.1.4 左移位和右移位操作符 7.2 掩码 7.3 软件工具:打印int值的二进制形式 7.4 包装和解包 7.5 枚举类型 7.6 例子...

    C/C++中的sizeof运算符和size_t类型的详解

    sizeof的作用 sizeof是c的运算符之一,用于获取操作数被分配的内存...size_t是标准C库中定义的,应为unsigned int,在64位系统中为 long unsigned int。 sizeof返回的必定是无符号整形,在标准c中通过typedef将返回值

    高质量 C++/C 编程指南

    , 涵盖了C++程序设计的每一个方面,包括设计和编码风格、函数、操作符、类的设计、继承、构造与析构、赋值、名字空间、模块、模板、泛型、异常、STL容器和算法等。书中对每一条规范都给出了言简意赅的叙述,并辅以...

    C语言中的sizeof操作符用法及和strlen的区别

     sizeof是C/C++中的一个操作符(operator),简单的说其作用就是返回一个对象或者类型所占的内存字节数。其返回值类型为size_t,在头文件stddef.h中定义。在32位系统中: char的sizeof值为1,char是我们编程能用的...

    新手学习C++入门资料

    这些关键字能作为函数和变量的标识符在C程序中使用,尽管C++包含了所有的C,但显然没有任何C++编译器能编译这样的C程序。 C程序员可以省略函数原型,而C++不可以,一个不带参数的C函数原型必须把void写出来。而C++...

    Visual C++ 2010入门经典(第5版)--源代码及课后练习答案

    6.7 使用decltype操作符 263 6.8 使用函数的示例 265 6.8.1 实现计算器 265 6.8.2 从字符串中删除空格 268 6.8.3 计算表达式的值 268 6.8.4 获得项值 270 6.8.5 分析数 271 6.8.6 整合程序 274 6.8.7 扩展...

Global site tag (gtag.js) - Google Analytics