栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

逻辑、算数左移右移

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

逻辑、算数左移右移

参考链接:
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 

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;
}

运行结果

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/296284.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号