C/C++操作硬件的位运算

C/C++操作硬件的位运算

上节我们讲了逻辑运算符。C/C++用于综合决策的逻辑运算(两个变量)

本节我们讲位运算。

  • 一般用于处理硬件。把地址0x80040的寄存器的最低四位设置成0110

  • 使用位运算符:&, |,~,^,<<,>>(位与,位或,位非,异或,左移,右移)

  • 什么是位:

    一个字节8位,内存一个字节一个字节的排列。

位与 &

  • 0 & 0 0
    0 & 1 0
    1 & 0 0
    1 & 1 1
    对应位,都是1结果才是1

  • 19 & 7
    0001 0011
    0000 0111 &


    0000 0011 -> 3

例子:

#include <iostream>

int main() {

	std::cout << (19 & 7) << std::endl;
	
	return 0;
}

输出结果:

3
  • 注意: 要用括号把19&7括起来

位或 |

  • 0 & 0 0
    0 & 1 1
    1 & 0 1
    1 & 1 1
    对应位,都是0结果才是0

  • 19 & 7
    0001 0011
    0000 0111 |


    0001 0111 -> 23

例子:

#include <iostream>

int main() {

	std::cout << (19 | 7) << std::endl;
	
	return 0;
}

输出结果:

23
  • 注意: 要用括号把19|7括起来

位非 ~

  • ~0 1
    ~1 0
    取反

  • unsigned char x = ~19
    ~19
    0001 0011 ~


    1110 1100 -> 236

例子:

#include <iostream>

int main() {
	unsigned char x = ~19;
	std::cout << (int)x << std::endl;
	
	return 0;
}

输出结果:

236

异或 ^

  • 0 & 0 0
    0 & 1 1
    1 & 0 1
    1 & 1 0
    对应位不同,才是1

  • 19 ^ 7
    0001 0011
    0000 0111 ^


    0001 0100 -> 20

例子:

#include <iostream>

int main() {

	std::cout << (19 ^ 7) << std::endl;
	
	return 0;
}

输出结果:

20
  • 注意: 要用括号把19^7括起来

左移 <<

  • 右边的位用0来填充,移动超出左边边界的位则直接抛弃。

    向左移动n个位置,就等同于乘以2n

  • 注意: 只适用于short/int/long/char等定点数类型(float/double浮点数不能使用)

  • 19 << 2
    0000 0001 0011 <<
    0000 0100 1100 -> 76
    相当于乘以22

右移 >>

  • 左边的位用0来填充,移动超出右边边界的位则直接抛弃。

    向右移动n个位置,就等同于除以2n

  • 注意: 只适用于short/int/long/char等定点数类型(float/double浮点数不能使用)

  • 19 >> 2
    0000 0001 0011 >>
    0000 0000 0100 -> 4
    相当于除以22

问题解决

  • 问题:把一个整数的最低四位设置成0110
  • 第一步:把数字的后四位清空。
  • 第二步:与0110进行位或
#include <iostream>

int main() {

	int x;

	std::cout << "请输入一个整数";
	std::cin >> x;

	//将最低四位清零
	//其他位不变
	x = x & (~15);
	//把最低四位设置成0110
	x = x | 6;
	
    std::cout << x << std::endl;
	return 0;
}

输入:46

输出结果:

38
  • 分析:38的二进制为0010 0110成功

本节介绍了位运算符。下节讲运算符的优先级。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值