位运算

作者: 波洛的汽车电子世界 | 来源:发表于2019-05-01 23:30 被阅读0次

注:以下大部分内容来源于 coursera 课程《C++程序设计》
基本概念:

  1. 低八位,高八位:
    0x4455 二进制形式-->0100 0100 0100 0101
    从右往左数是从第0位到第15位,0100 0100 是高八位,0100 0101是低八位。
    由于计算机仅识别二进制描述的数字,所以对一个内存地址,也就是8位二进制,如:0000 0001,0000就是高四位,0001就是低四位,当然2个内存地址,就是16位二进制,也就是:0000 0001 0000 0002。0000 0001 就是高八位,0000 0002就是低八位,每个八位中又分成高低四位。如:1010 0001 1111 0101,换算成16进制就是:1010–10(10进制)—A(16进制),0001–1(10进制)—1(16进制)所以他的高八位就是A1,同样它的低八位就是F5。
    2.负数的2进制:
    负数以原码的补码形式表达。
    一个负数按照绝对值大小转换成的二进制数,然后最高位补1,称为原码。负数的补码为对该数的原码除符号位外各位取反,然后在最后一位加1。
    8位有符号的整数取值范围的补码表示:1000 0000 到 0000 0000, 再到 0111 1111,即 -128 到 0, 再到 127,最终 -128 ~ +127。
    -15:原码:10001111 补码:11110001

与运算&

作用:通常可以用来将某些变量中的某些位清零且同时保持其他位不变,也可以用来获取某变量中的某一位。
如果需要将int型的变量n的低八位全置成0,而其余位不变,则可以这样做:

n = n & 0xffffff00;

低八位置成0,高二十四位保持不变。
也可以写成:

n &= 0xffffff00;

如果n是short类型的,short只有16位,那么则写成

n &= 0xff00;

如果要判断一个int型变量n的第7位(从右往左,从0开始数)是否为1,那么,则可以这样:

n &= 0x80;

或运算|

作用:将某变量中的某些位置置1且保留其他位不变。
例如,要将int类型的变量n的低八位置成1,其余位保持不变,那么可以这样做:

n |= 0xff;

异或运算^

不相同为1,相同为0
作用:将某些变量中的某些位取反,并保持其他位不变。
例如,要将int类型的变量n的低八位取反1,其余位保持不变,那么可以这样做:

 n ^= 0xff;

性质:

1.     A ^ 0  = A;
2.     若a^b = c,则c^b=a, c^a = b; 
3.     a = a^b, b = a^b,a = a^b;

性质2: 列举a和b可能的四种情况,穷举法可证。且此规律可以用来加密和解密:b用作密钥,a^b生成密文c。反之由密文c解出a,则可以用c^b=a。
性质3:不通过临时变量,交换a,b的值,穷举法可证。

性质3举例:
a = 5, b = 7
a = 0101, b = 0111
a = a^b = 0010
b = a^b = 0101
a = a^b = 0111

非运算~

左移运算<<

a<<b的过程是将a各二进位全部左移b位得到的值,高位丢弃,低位补零。a的值不因运算而改变。
例子:

9<<4:
00001001
10011001 = 144

性质:左移操作相当于乘以2^n, 并且左移操作快于乘法。

右移运算>>

a>>b的过程是将a各二进位全部右移b位得到的值,右边的位丢弃。
左边的数有讲究:
1.如果是有符号的数,l例如int, long, short,char这些类型的变量。右移时,符号位(即最高位)一起移动。
2.如果原符号位为1,那么左边补的那些位都为1。
性质:移移操作相当于除以2^n

-25>>4 = -2 (往小里取)
-2>>4 = -1
例子截图

思考题1:有两个int型的变量a和n(0<=n<=31),要求写一个表达式,使该表达式的值和a的第n位相同。
思路:出题意图是看a的第n位是0还是1,这里可以将a的第n位取出来,和1做与运算。1只有最右一位是1,其余位都是0。
答案: (a>>n)&1
思考题2:有两个int型的变量a和n(0<=n<31),要求写一个表达式,使该表达式的值和a的第n位相同。
答案:(a&(1<<n))>>n

布尔运算符
c++里加一句: boolalpha,就会输出true false,否则会输出 01。

#include <iostream>
#include <iomanip>
using namespace std;
int main()
{
   bool flag = true;
   cout << boolalpha;
   cout << "15大于88吗?"<< (15>18)<<endl;

   return 0;
}
`

相关文章

  • 3、小众运算符の大课堂(一)

    较为简单の位运算符: & 位与运算| 位或运算^ 位异或运算~ 位取反运算 举例: 要做位运算,首先要把数据转...

  • 位运算及其应用

    内容概要: 位运算基本操作 基于位运算的状态压缩 位运算经典应用 位运算解N皇后问题 位运算 符号描述规则&与1&...

  • 位运算及用位运算实现权限控制

    请自行补习位运算相关知识 位运算 位运算示例 权限控制

  • 开发基础随笔之位运算符(Bitwise Operators)

    位运算符,属于算术运算符 按位逻辑运算符: 位移运算符: 位运算符的运算数只能是整数 位移运算符:按位左移 a<<...

  • 强大的位运算符

    位取反运算符 位取反运算符(~)是对所有位的数字进行取反操作位取反运算符.png 位与运算符 位与运算符(&)可以...

  • 位运算

    位运算 1. &:按位与 规律:一假则假任何位上的数和1相&得到的结果还是那个数 2. |:按位或 规律:一真则真...

  • 位运算

    https://leetcode.com/problems/gray-code/description/这个位运算...

  • 位运算

    位运算符比一般的算术运算符速度要快,而且可以实现一些算术运算符不能实现的功能。如果要开发高效率程序,位运算符是必不...

  • 位运算

    1.不用加减乘除做加法 解法:分为三步①各位相加不进位,即先按位异或;②做进位,按位与并左移位;③结果相加,直至没...

  • 位运算

    位运算不仅可以简化某些复杂的操作,而且具有更快的计算速度。典型的应用就是除法,交换两个数值,以及在一个数组中寻找只...

网友评论

      本文标题:位运算

      本文链接:https://www.haomeiwen.com/subject/uynwnqtx.html