逻辑、算数左移右移

参考链接:
https://blog.csdn.net/zgcjaxj/article/details/105920062
https://blog.csdn.net/hengshan/article/details/6440549


一、概述

逻辑左移和算术左移,都是在右边补0,效果一样。左移1bit,相当于原数 乘以2。

逻辑右移:右移后,左边补0

算术右移:右移后,左边补符号位,添加的位与原数的符号位相同,正数(0算作正数的一个)补0,负数补1。算术右移1bit,相当于原数 除以2。

C/C++中,对于无符号数,可以认为是逻辑左移和逻辑右移。对于有符号数,可以认为是算术左移和算术右移,

要对一个有符号数 执行逻辑右移,可以先将它强制类型转换为无符号类型。

要对一个无符号数 执行算术右移,可以先将它强制类型转换为有符号类型。


二、说明

  1. 逻辑/算数 左移
    请添加图片描述

  2. 逻辑右移/正数右移
    请添加图片描述

  3. 负数右移
    请添加图片描述


三、实例

#include <iostream>

using namespace std;

typedef signed char s8;
typedef unsigned char u8;
//typedef unsigned int u8;
typedef unsigned short u16;
typedef signed short s16 ;
typedef unsigned int  u32;
typedef signed int s32;
typedef signed __int64 s64;
typedef unsigned __int64 u64;


int main(void)
{
	u8 aucData[1+4+8] = {0};
	u32 ulCanID = 0x21345678;

    aucData[1] = (u8)(ulCanID >> 24);	// 右移24位变成0x00000021,强制u8保留0x21,对应的ASCII码 !
    aucData[2] = (u8)(ulCanID >> 16);	// 右移16位变成0x00002134,强制u8保留0x34,对应的ASCII码 4
    aucData[3] = (u8)(ulCanID >> 8);	// 右移8位变成0x00123456,强制u8保留0x56,对应ASCII码 V
    aucData[4] = (u8)(ulCanID >> 0);	// 0x12345678,强制u8保留0x78,对应ASCII码 x

	cout << "aucData[1] = " << aucData[1] << endl;
	cout << "aucData[2] = " << aucData[2] << endl;
	cout << "aucData[3] = " << aucData[3] << endl;
	cout << "aucData[4] = " << aucData[4] << endl;

	return 0;
}

运行结果

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值