当前位置: 首页 > news >正文

移位操作符技巧

目录

一、移位操作符概述

二、左移操作符 (<<)

1、移位规则

2、示例代码

3、运算过程演示

三、右移操作符 (>>)

1、移位规则

逻辑右移

算术右移

2、示例代码

3、运算过程演示

四、重要警告

五、注意事项


一、移位操作符概述

C语言提供了两种移位操作符:

  • << 左移操作符

  • >> 右移操作符

重要说明移位操作符的操作数只能是整数类型(包括有符号和无符号整数)。


二、左移操作符 (<<)

1、移位规则

  • 将操作数的二进制表示向左移动指定的位数

  • 左边超出位被丢弃,右边空出位补0

2、示例代码

#include <stdio.h>int main()
{int num = 10;       // 二进制: 0000 1010 (假设int为8位)int n = num << 1;    // 左移1位: 0001 0100 (20)printf("n = %d\n", n);      // 输出: 20//原始值 (10):  00001010//左移1位后:   00010100  (20)printf("num = %d\n", num);  // 输出: 10 (原值不变)return 0;
}

3、运算过程演示


三、右移操作符 (>>)

1、移位规则

右移操作分为两种类型,具体使用哪种取决于编译器和数据类型:

逻辑右移

  • 左边用0填充

  • 右边丢弃超出位

算术右移

  • 左边用原值的符号位填充(保持符号不变)

  • 右边丢弃超出位

注意对于无符号整数,右移总是逻辑右移;对于有符号整数,通常是算术右移,但这由编译器决定。

2、示例代码

#include <stdio.h>int main()
{int num = 10;       // 二进制: 0000 1010int n = num >> 1;   // 右移1位: 0000 0101 (5)printf("n = %d\n", n);      // 输出: 5//逻辑右移 (10):  00001010 → 00000101 (5)//算术右移 (-10): 11110110 → 11111011 (-5) [假设补码表示]printf("num = %d\n", num);  // 输出: 10 (原值不变)return 0;
}

3、运算过程演示


四、重要警告

警告⚠⚠:不要移动负数位,这是C标准未定义的行为,会导致不可预测的结果。例如:

int num = 10;
num >> -1;  // 错误!未定义行为

五、注意事项

  1. 移位操作不会改变原变量的值,除非进行自移位操作(如 num <<= 1

  2. 移动的位数不应超过或等于数据类型的位数(如32位int不应移动32位或更多)

  3. 右移有符号负数时结果依赖于实现(通常是算术右移)

  4. 移位操作常用于高效的乘除2的幂次方运算,但要注意溢出问题

http://www.dtcms.com/a/331127.html

相关文章:

  • 8. 函数简介
  • DeepSeek补全IBM MQ 9.4 REST API 执行命令的PPT
  • Mac chrome浏览器下载DevEco Studio 6.0.0 Beta2失败
  • 分布式锁—Redisson的公平锁
  • 线上故障定位:从报警到根因的实战指南
  • Eureka故障处理大汇总
  • 使用 Git Submodules 管理前后端分离项目
  • scikit-learn/sklearn学习|广义线性回归 Logistic regression的三种成本函数
  • Docker 核心技术:Namespace
  • Java毕业设计选题推荐 |基于SpringBoot的健身爱好线上互动与打卡社交平台系统 互动打卡小程序系统
  • 2019 GPT2原文 Language Models are Unsupervised Multitask Learners - Reading Notes
  • [激光原理与应用-274]:理论 - 波动光学 - 光是电磁波,无线电磁波可以通过天线接收和发送,为什么可见光不可以?
  • Visual Studio2019/2022离线安装完整教程(含闪退解决方法)
  • 无人机双目视觉设计要点概述!
  • SOD-YOLO:基于YOLO的无人机图像小目标检测增强方法
  • 值传递+move 优化数据传递
  • torchvision中数据集的使用与DataLoader 小土堆pytorch记录
  • Autoppt-AI驱动的演示文稿生成工具
  • 深入理解 RAG:检索增强生成技术详解
  • 通过机器学习框架实现Android手写识别输入功能
  • 【开源工具】基于硬件指纹的“一机一码”软件授权系统全实现(附完整源码)
  • MapReduce系统架构,颠覆了互联网分层架构的本质?
  • xiaozhi-esp32 仓库分析文档
  • 树莓派 4B 上部署 Minecraft PaperMC 1.20.x 的一键部署脚本
  • [论文阅读] 人工智能 + 软件工程 | 代码变更转自然语言生成中的幻觉问题研究解析
  • 智能家居主控板:智慧家庭的核心大脑
  • 华为实验 链路聚合
  • 实测对比:飞算JavaAI vs 人工编码,谁在效率与质量上更胜一筹?
  • C#WPF实战出真汁03--登录功能实现
  • 本文详细讲解QJson 的用法