【c++基础语法】位运算

1 bitset函数 

计算机的内存数据存储是一个个小格子,每个小格子0或1,位运算就是算这些小格子里面的数据。

在数据加密、解密;算法优化有很大的作用。

#include <iostream>
#include <bitset>

int main()
{
    int a{ (int)0b111111111111111111111111111111111111111111 };//oxffffffff
    std::cout << a << std::endl;

    std::cout << std::bitset<32>(a);

    return 0;
}

2 左移右移 

 int a{ (int)0b111111111111111111111111111111111100000000 };//oxffffffff

 a <<= 8;
 std::cout << std::bitset<32>(a) << std::endl;

 unsigned b{ (unsigned)a };
 b >>= 7;
 std::cout << std::bitset<32>(b) << std::endl;

看下面一个现象 为什么a先左移  再右移位以后不用0来补  用1来补 ???

#include <iostream>
#include <bitset>

int main()
{
    int a{ 11111111111111111111111111111111 };//oxffffffff

    a <<= 8;
    std::cout << std::bitset<32>(a) << std::endl;

    unsigned b{ (unsigned)a };
    b >>= 7;
    std::cout << std::bitset<32>(b) << std::endl;

    a >>= 7;
    std::cout << std::bitset<32>(a) << char(10);

    return 0;    
}

a 是带符号的整数值,b是无符号做位移操作的时候用0来补,而a做移位的时候有可能补0也有可能补1;原因  

 

此时+3 加上-3 为 1 0 0 0 0 1 1 0 ,这是一个负数(-6),肯定不是0,如果是0全部都是0;那这种计数方式人看着特别爽,但是计算机看了直摇头;所以为了计算机又有一种计算方式,2来补码;方法如下:

比如内存格子八个格子3的存储:00000011;先翻个个:1 1 1 1 1 1  0 0;然后再给这个数加一;1 1 1 1  1 1 0 1  !!!

这个变化以后的数字就是-3!   1 1 1 1 1 1 0 1(补码应运而生)

人看着很难受 !计算机很爽!因为它的计算方便了;此时+3 加上 -3;

0 0 0 0 0 0 1 1

1 1 1 1 1 1 0 1    +

一路往前进位 所有的都变0

往前移位相当于乘以2,因为二进制,一个格子有两个0 ,1,两种可能性,往前走一个格子相当于乘以2;

a << N = a * 2^N

向右位移 相当于做除法;

题归正传:int 右移为什么是 补位 1?

因为-3是一个负数;右移位以后 必须保持符号位移运算的基本规则 保持移位数字本身的正负性;左移乘 右移除;

正数右移补0,负数右移补1, 

负数右移位以后 左边要补1;保持正负性

 

3.位移运算求反~ 、与&、或|、异或^(不进位加法运算)

 

 

 

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

康康今天学习了么

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值