深入理解C语言中的移位运算

2023-11-01


 

深入理解C语言中的移位运算

移位运算:

C语言还提供了一组移位运算,以便向左或者向右移动位模式。对于一个位表示为[xn-1,xn-2,…,x0]的操作数x,C表达式x<<k会生成一个值,其位表示为[xn-k-1,xn-k-2,…,x0,0,…,0]。也就是说,x向左移动k位,丢弃最高的k位,并在右端补k个0。移位量应该是一个0~n-1之间的值。移位运算是从左至右可结合的,所以x<<j<<k等价于(x<<j)<<k。
</k会生成一个值,其位表示为[xn-k-1,xn-k-2,…,x0,0,…,0]。也就是说,x向左移动k位,丢弃最高的k位,并在右端补k个0。移位量应该是一个0~n-1之间的值。移位运算是从左至右可结合的,所以x<<j<<k等价于(x<<j)<<k。

有一个相应的右移运算x>>k,但是它的行为有点微妙。一般而言,机器支持两种形式的右移:逻辑右移和算术右移。逻辑右移在左端补k个0,得到的结果是[0,…,0,xn-1,xn-2,…,xk]。算术右移是在左端补k个最高有效位的值,得到的结果是[xn-1,…,xn-1,xn-1,xn-2,…,xk]。这种做法看上去可能有点奇特,但是我们会发现它对有符号整数数据的运算非常有用。

让我们来看一个例子,下面的表给出了对某些实例8位数据做不同的移位操作得到的结果。

操作

参数X

[0110 0011] [1001 0101]

X<<4

[0011 0000] [0101 0000]

X>>4(逻辑右移)

[0000 0110] [0000 1001]

X>>4(算术右移)

[0000 0110] [1111 1001]

斜体的数字表示的是最右端(左移)或最左端(右移)填充的值。可以看到除了一个条目之外,其他的都涉及填充0。唯一的例外是算术右移[10010101]的情况。因为操作数的最高位是1,填充的值就是1。

C语言标准并没有明确定义应该使用哪种类型的右移。对于无符号数据(也就是以限定词unsigned声明的整型对象),右移必须是逻辑的。而对于有符号数据(默认的声明的整型对象),算术的或者逻辑的右移都可以。不幸的是,这就意味着任何假设一种或者另一种右移形式的代码都潜在着可移植性问题。然而,实际上,几乎所有的编译器/机器组合都对有符号数据使用算术右移,且许多程序员也都假设机器会使用这种右移。

对于如何区分逻辑右移和算术右移一般说来无符号整型采用逻辑右移;带符号整型采用算术右移。

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

深入理解C语言中的移位运算 的相关文章

  • 图形分析之Nsight的使用

    作者 i dovelemon 日期 2017 06 11 来源 CSDN 主题 Nsight OpenGL 引言 最开始的时候 我进行图形编程使用的是DX 所以那时候进行图形分析的时候 基本都是使用PIX 后来转向了OpenGL 分析的时候
  • JVM-17(垃圾回收器)上

    目录 17 1 GC分类与性能指标 17 1 1 JVM的发展 17 1 2评估GC的性能指标 17 2 不同的垃圾回收器概述 17 3 Serial回收器 串行回收 17 4 ParNew回收器 并行回收 17 5 Parallel回收器
  • html超链接打开共享文件夹,教你如何访问共享文件夹

    现在我们往往要讲究 资源共享 就是有好的东西跟大家一起分享 那么到电脑上呢经常有一些文件夹 有的是加密的 有的是共享的 今天呢小编就要给大家讲讲如何访问这些共享文件夹 要想查看共享文件夹其实也是有步骤可言的 首先 要先打开控制面板 有一个W
  • 电脑开机就显示360服务器,我用360给电脑杀毒,一直到开机启动项会停止,显示“扫面服务意外终止,无法继续扫描,这可能是由于程序...

    希望我的回答可以帮助楼主解决问题哦 这个问题很明显是杀毒软件自身的问题 不太知道诺顿这款杀毒软件 是不是在升级过程中发生什么问题造成的 楼主可以尝试换用腾讯电脑管家 这款杀毒软件在病毒以及木马的查杀方面很权威 很成熟 下面是我总结的电脑容易
  • ZGC收集器介绍

    ZGC收集器 XX UseZGC ZGC是一款JDK 11中新加入的具有实验性质的低延迟垃圾收集器 ZGC可以说源自于是Azul System公司开发的C4 Concurrent Continuously Compacting Collec

随机推荐

  • OK6410矩阵键盘驱动问题解决方案

    在嵌入式系统开发中 矩阵键盘是一种常见的输入设备 OK6410是一款广泛使用的ARM开发板 本文将介绍如何在OK6410开发板上实现矩阵键盘的驱动 硬件连接 首先 我们需要将矩阵键盘与OK6410开发板进行连接 矩阵键盘通常由多个行和列组成
  • ResNet到底在解决一个什么问题呢?

    点击上方 小白学视觉 选择加 星标 或 置顶 重磅干货 第一时间送达 来源 知乎 https www zhihu com question 64494691 文仅交流 侵删 ResNet发布于2015年 目前仍有大量CV任务用其作为back
  • C# 代码转化为Java代码

    http www tangiblesoftwaresolutions com Free Editions html Install Instant C converts VB NET code to C Install Instant VB
  • 史上最全midjourney关键词

    最全midjourney关键词 篇幅太长 文章最后有可编辑版本获取链接 增强图片真实感 清晰度 unreal engine 虚幻引擎 ultra realistic 超真实 photography 摄影图片 detailed 细节 4K 4
  • LaTeX 使用笔记——公式篇

    目录 一 行内公式 二 独立公式 一 行内公式 二 独立公式 一 括号 1 当括号的两边分别位于上下两行公式 且可能出现两个括号大小不一致的情况 例如 使用LaTeX代码 begin aligned dot V k v 1 z k v 1
  • 一次性搞清楚unicode、codepoint、代码点、UTF

    最近在处理字符过滤 重新研究了下字符 unicode和代码点的相关知识 首先要说一下编码的基本知识unicode unicode unicode是计算机科学领域里的一项业界标准 包括字符集 编码方案等 计算机采用八比特一个字节 一个字节最大
  • Python 爬虫获取某贴吧所有成员用户名

    最近想用Python爬虫搞搞百度贴吧的操作 所以我得把原来申请的小号找出来用 有一个小号我忘了具体ID 只记得其中几个字母以及某个加入的贴吧 所以今天就用爬虫来获取C语言贴吧的所有成员 计划很简单 爬百度贴吧的会员页面 把结果存到MySQL
  • FreeMarker模板使用方法讲解

    项目需要 刚接触 正在学习 FreeMarker简介 FreeMarker模板文件主要由如下4个部分组成 1 文本 直接输出的部分 2 注释 lt gt 格式部分 不会输出 3 插值 即 或 格式的部分 将使用数据模型中的部分替代输出 4
  • 深度学习之基于CNN实现汉字版手写数字识别(Chinese-Mnist)

    Mnist数据集是深度学习入门的数据集 昨天发现了Chinese Mnist数据集 与Mnist数据集类似 只不过是汉字数字 例如 一 二 三 等 本次实验利用自己搭建的CNN网络实现Chinese版的手写数字识别 1 导入库 import
  • C++疑难杂症 error LNK2001: 无法解析的外部符号

    问题简述 error LNK2001 无法解析的外部符号 private static int ETH m age m age ETH 0HA 这类问题是我们在编译过程很常见 原因我百度的时候发现也分好几种 有可能是没有包含相应的头文件 也
  • vue 用axios请求接口的使用以及配置

    若依框架前后端分离 用axios请求接口的使用以及配置 首先需要下载安装 cnpm install axios save 安装完成以后进行配置 打开main js import axios from axios Vue prototype
  • .NET静态代码检查工具StyleCop的安装与使用

    最近需要做一个C 项目的代码走查 其中的一项内容就是要用代码的静态分析工具对代码进行检测 我的想法是使用VisualStudio自带的Microsoft托管建议规则外加StyleCop工具检测问题 主要是警告 再对这些问题逐一分析 我使用的
  • cbm+soma+simm ibm的SOA实施方法论

    cbm soma simm ibm的SOA实施方法论http www ibm com developerworks cn webservices 0909 CBM SIMM SOMA soa
  • 如何通过solc编译solidity编写的以太坊智能合约

    solc solidity的编译器 solidity编写的以太坊智能合约可通过命令行编译工具solc来进行编译 成为以太坊虚拟机中的代码 solc编译后最终部署到链上形成我们所见到的各种智能合约 作为一个solidity命令行编译工具 我们
  • 使用chrome开发者工具调试JavaScript代码的三种常用方法

    对 JS 程序的调试 除了在 JS 程序中使用 alert console log 方法跟踪和调试代码外 开发人员也会经常使用一些调试工具 最常用的 JS 调试工具就是一些主流的浏览器的调试工具 如 IE11 浏览器的 开发人员工具 Fir
  • shell的case语句

    case语句格式 vi test sh echo input read num echo the input data is num case num in 1 echo January 双分号结束 2 echo Feburary 5 ec
  • 计算两个整数的乘积——python

    输入两个整数 求它们的乘积 输入格式 输入两个整数a b 输出格式 输出a b c 其中a b是输入的整数 c是a与b的乘积 输入样例 在这里给出一组输入 例如 2 5 输出样例 在这里给出相应的输出 例如 2 5 10 a b input
  • 等保二级-操作系统CentOS加固说明

    文章目录 等保二级加固 操作系统 加固说明 加固脚本 加固结果验证 1Panel安装 等保二级加固 操作系统 加固说明 注释账户 lp sync shutdown halt news uucp operator games gopher s
  • centos7下对存有服务的硬盘非LVM分区进行扩容

    文章目录 前言背景 一 环境说明 二 操作步骤 1 暂停服务 备份数据 2 卸载硬盘 3 操作硬盘分区所在的硬盘 4 把新建的硬盘分区做成逻辑卷 1 检查是否安装逻辑券软件包 2 建立物理卷 3 建立卷组 4 建立逻辑卷 5 格式化 并 挂
  • 深入理解C语言中的移位运算

    深入理解C语言中的移位运算 移位运算 C语言还提供了一组移位运算 以便向左或者向右移动位模式 对于一个位表示为 xn 1 xn 2 x0 的操作数x C表达式x lt