首页 > 编程语言 >c++学习 4 运算符及其应用技巧

c++学习 4 运算符及其应用技巧

时间:2023-02-08 02:44:05浏览次数:52  
标签:十六进制 0000 技巧 c++ 运算符 按位 1100 data

一 按位与运算符

“&”按位与运算符,全1为1,有0则0。

特点:和1相与保持不变,和0相与都变为0。

功能:将指定位置清0。

example:

   1000 1100

& 1100 1011

------------------------------

   1000 1000

unsigned int data;//目标:将1字节的data第3、4位清零。

data = data & 1110 0111;//注意,c++语言并不支持直接识别二进制数位做按位运算,必须得转换成十六进制。

data = data & 0xe7;//这才是正确的写法,但是难写并且可读性很低(十六进制的转换)。

//所以我们必须在十六进制的基础上优化写法,后续知识点补全后一起说

data &= 0xe7;//这个也行,而且写出来方便简洁。

 

二 按位或运算符

“|”按位或运算符,有1为1,全0才0。

特点:和1相或都得1,和0相或保持不变。

功能:将指定位置至为1。

example:
    1000 1100

|   1100 1111

----------------------------

    1100 1111

unsigned int data;//data为1字节,将data的5、6位置为1,其他位不变。

data = data | 0110 0000;//在c++中,位数计数顺序是从右到左的。

data = data | 0x60;//而且也是需要十六进制才能被c++识别。

data |= 0x60;//简朴写法。

 

三 按位取反运算符

“~”按位取反运算符,0变1,1变0.

特点:取反码。

功能:配合按位与(&)和按位或(|)进行操作。

example:~1001 1100 == 0110 0011;

 

四 按位异或运算符

“^”按位异或运算符,相同位数为0,不同位数为1。

特点:和1异或取反,和0异或保持不变。

功能:将指定位发生翻转。

example:

    1100 0011

^   1011 1111

-----------------------

      0111 1100

1011 1100 ^ 1111 0000 == 0111 1100

 

五 左移运算符

“<<”左移运算符,左边丢弃,右边补0。

注意:移动的位数不要超过自身位的宽度。

example:

int data = 1011 0000;

data = data<<3;

cout<<data<<;//data等于1000 0000。

如果data=0000 0001=1,那么data<<1 = 0000 0010 =2=1*2^1;

以此类推,data << 2 = 0000 0100 = 4 =2^2;

data << 3 = 0000 1000 = 8 =2^3;

所以<<几位就是乘上2的几次方。

 

六 右移运算符

“>>”右移运算符,右边丢弃,左边补0或者补1。

注意:补0(逻辑右移)还是补1(算数右移)由编译器自己决定,用户无法自己决定。

无符号数:右边丢弃,左边补0。

正数:右边丢弃,左边补0。

负数:右边丢弃,左边补0(逻辑右移);

负数:右边丢弃,左边补1(算数右移)。

由五可知,data>>几位其实也就相当于除以2^x。

 

七 位运算符的综合应用

在书写按位运算符时,由于十六进制的限制导致我们无法快速解读出究竟是清0还是置1,以及操作位数是哪几位等等。所以我们需要借助特殊的写法来在十六进制的基础上提高位运算符的可读性。

example:

在按位与运算符中,我们做了“将data3、4位清0”的操作。

data &= 0xe7;//即为data &= 1110 0111;

我们来对1110 0111变形

1110 0111 == ~(0001 1000) == ~(0001 0000 | 0000 1000)//这一步重点理解!!!

== ~(0000 0001<<4 | 0000 0001<<3) == ~(0x01<<4 | 0x01<<3)

所以最后结果就可以写为

data &= ~(0x01<<4 | 0x01<<3);

不仅提高可读性,也降低了转换为十六进制的难度,可谓是一石二鸟。

同理可得,按位或运算符的例子里,data |= 0x60也可以因此转换。

data |= 0110 0000 == (0100 0000 | 0010 0000) == (0000 0001<<6 | 0000 0001<<5)

== (0x01<<6 | 0x01<<5)

所以也可以转换为 data |= (0x01<<6 | 0x01<<5);

总结:

1.有取反(~)是清0,无取反是置1;

2.使用这种写法,不仅可以根据操作位数直接写出十六进制,而且大大提高可读性,降低了操作难度。

标签:十六进制,0000,技巧,c++,运算符,按位,1100,data
From: https://www.cnblogs.com/wangbohan/p/17100342.html

相关文章

  • c\c++ BUG Segmentation fault 段错误
    起初是我写朋友课设遇到的问题,跑程序起来发现无法读取链表信息到文件里,换了一个ide后发现是fscanf报错Segmentationfault查询资料发现是段错误那么什么是段错误呢下面......
  • 【LeetCode哈希表#4】梦开始的地方:两数之和(map),以及关于容器map的一些代码技巧
    两数之和力扣题目链接(opensnewwindow)给定一个整数数组nums和一个目标值target,请你在该数组中找出和为目标值的那两个整数,并返回他们的数组下标。你可以假设每......
  • 【JavaScript】5_常见的运算符(三种逻辑运算符+关系运算符)
    5、逻辑运算符1!逻辑非!可以用来对一个值进行非运算它可以对一个布尔值进行取反操作true-->falsefalse-->true如果对一个非布尔值进行取反,它会先将其转换为布尔值......
  • C++中的共享指针以及循环引用
    C++中shared_ptr对象之间可以共享对象的拥有权,但是这种共享的对象引用在某些情况下可能会引发一些问题。例如,循环引用会造成两个对象之间相互引用,无法删除对象。一个循环......
  • C++编程中遇到的问题
    函数中无法通过sizeof运算得到数组的大小及维数,因为,数组形参实际上是指针类型。#include<iostream>usingnamespacestd;//数组作为参数时,退化为简单的指针voidg......
  • C++ Day14 借助智能指针实现文本查询查询
    一、设计思路数据结构:1、读取文件时,要记住文件的每一行,并且要将每一行分解为独立的单词vector<string>vec;istringstream2、输出时提供每个单词与其关联的行号,且......
  • 分支语句及三元运算符
    三元运算符var a=boolean?true:false//boolean是true取truefalse取false表达式算数表达1-1-1条件表达式1-1>1关系表达式true&&1运算符的执行流程示例......
  • C++中的值类别与模板推导
    C++中表达式的值类别C++中的表达式有两个属性,分别是值类型和值类别,本篇文章着重于表达式的值类别。C++中表达式的值类别分为以下几种泛左值(glvalue,generalizedlvalue):这......
  • c++常用知识点复盘
    、Linux内存管理机制内存全貌图:  Linux内存分为用户态和内核态两种,以32位4G的Linux内存为例进行说明,其区别如下:用户态:Ring3运行于用户态的代码......
  • iOS崩溃调试的使用和技巧总结
    在iOS开发调试过程中以及上线之后,程序经常会出现崩溃的问题。简单的崩溃还好说,复杂的崩溃就需要我们通过解析Crash文件来分析了,解析Crash文件在iOS开发中是比较常见的。......