【C语言】超详细的移位、位操作符详解(含力扣实战)

【C语言】超详细的移位、位操作符详解(含力扣实战)目录 1 整数的二进制表示 2 移位操作符 2 1 左移操作符 低位补 0 举例 原理分析 2 2 右移操作符 算术右移 高位补原符号位 逻辑右移 高位补 0 3 位操作符 3 1 按位与 amp 原理分析 3 2 按位或 原理分析 3 3 按位异或 原理分析 4 实战应用 4 1 交换两个变量 不创建临时变量 原理分析 4 2 消失的数字 1 思路一 冒泡排序 先排序后遍历 时间复杂度 O n 不

【C语言】超详细的移位、位操作符详解(含力扣实战)

【C语言】超详细的移位、位操作符详解(含力扣实战)


?推荐一款模拟面试、刷题神器 、从基础到大厂面试题:?点击跳转刷题网站进行注册学习


目录

​1、整数的二进制表示

​2、移位操作符

​2.1左移操作符(低位补0)

​举例

​原理分析

 ​2.2右移操作符

​算术右移(高位补原符号位)

​逻辑右移(高位补0)

​ 3、位操作符

​3.1按位与&

​原理分析

​3.2按位或|

​原理分析

​3.3按位异或^

​原理分析

​4、实战应用

​4.1交换两个变量(不创建临时变量)

​原理分析:

​4.2消失的数字

​(1)思路一:冒泡排序,先排序后遍历(时间复杂度O(n²),不符合题意)

​(2)思路二:(0-n的等差数列和)-(数组nums的和)

​(3)思路三——异或


【C语言】超详细的移位、位操作符详解(含力扣实战)1、整数的二进制表示

【C语言】超详细的移位、位操作符详解(含力扣实战)正数的原码、反码、补码相同,整数在内存中存储的是补码(所以需要用补码对移位、位操作符进行分析)。

【C语言】超详细的移位、位操作符详解(含力扣实战)负数的原反补不同,以-1为例:

原码:000000000000000000001(原码就是原码)

反码:(符号位不变,其他位按位取反)

补码:(补码=反码+1)

【C语言】超详细的移位、位操作符详解(含力扣实战)负数的补码也可以用该负数的绝对值-1,按位取反,即可得到该负数的补码。

【C语言】超详细的移位、位操作符详解(含力扣实战)2、移位操作符

<< 左移操作符 >> 右移操作符 移动的是二进制位,只能对整数进行整数位的移动

【C语言】超详细的移位、位操作符详解(含力扣实战)2.1左移操作符(低位补0)

【C语言】超详细的移位、位操作符详解(含力扣实战)举例

【C语言】超详细的移位、位操作符详解(含力扣实战)

 3的二进制位左移1位,输出结果为3。

【C语言】超详细的移位、位操作符详解(含力扣实战)原理分析

左移操作符,移动后,高位删除,低位补0;

每左移一位,原始数据乘2。

【C语言】超详细的移位、位操作符详解(含力扣实战)

 【C语言】超详细的移位、位操作符详解(含力扣实战)2.2右移操作符

【C语言】超详细的移位、位操作符详解(含力扣实战)算术右移(高位补原符号位)

【C语言】超详细的移位、位操作符详解(含力扣实战)

目前主流编译器都是采用算术右移,以VS为例,-1的二进制位向右移动一位,结果为-1。

【C语言】超详细的移位、位操作符详解(含力扣实战)

【C语言】超详细的移位、位操作符详解(含力扣实战)逻辑右移(高位补0)

由于主流编译器不采用逻辑右移,其原理同上不作介绍。

【C语言】超详细的移位、位操作符详解(含力扣实战) 3、位操作符

【C语言】超详细的移位、位操作符详解(含力扣实战)3.1按位与&

int main() { int a = -2; int b = 3; int c = a&b; printf("%d\n", c);//打印2 return 0; }

【C语言】超详细的移位、位操作符详解(含力扣实战)原理分析

【C语言】超详细的移位、位操作符详解(含力扣实战)

按位与指按二进制位,若两个数字的同一个二进制位均为1,则该位为1;反之,为0。

【C语言】超详细的移位、位操作符详解(含力扣实战)3.2按位或|

int main() { int a = -2; int b = 3; int c = a|b; printf("%d\n", c);//打印-1 return 0; }

【C语言】超详细的移位、位操作符详解(含力扣实战)原理分析

【C语言】超详细的移位、位操作符详解(含力扣实战)

按位或指按二进制位,若两个数字的同一个二进制位有1,则该位为1;反之,为0。

【C语言】超详细的移位、位操作符详解(含力扣实战)3.3按位异或^

int main() { int a = -2; int b = 3; int c = a^b; printf("%d\n", c);//输出-3 return 0; }

【C语言】超详细的移位、位操作符详解(含力扣实战)原理分析

【C语言】超详细的移位、位操作符详解(含力扣实战)

按位异或指按二进制位,两个二进制位相同为0相异为1。

【C语言】超详细的移位、位操作符详解(含力扣实战)4、实战应用

【C语言】超详细的移位、位操作符详解(含力扣实战)4.1交换两个变量(不创建临时变量)

不允许创建临时变量,交换两个整数的内容。

这是某互联网大厂的一道笔试真题。咱们很容易想到通过创建临时变量的方式来解决这道题,但是题目限制创建临时变量。那么可以通过异或的方式进行解决!

#include 
     
       int main() { int a = -2; int b = 3; a = a ^ b; b = a ^ b; a = a ^ b; printf("%d %d\n", a, b); return 0; } 
     

【C语言】超详细的移位、位操作符详解(含力扣实战)原理分析:

1、自身和自身异或得0;

2、任何数和0异或得本身;

第六行a(新)= a ^ b,指把a^b的值赋值a

第七行b(新)=a(新) ^ b=a ^ b^ b=a;(代入第六行的数据)

第八行a = a (新)^ b(新)=a ^ b^a=b; (代入上两行的数据)

实现a和b的交换!

【C语言】超详细的移位、位操作符详解(含力扣实战)4.2消失的数字

【C语言】超详细的移位、位操作符详解(含力扣实战)

【C语言】超详细的移位、位操作符详解(含力扣实战)(1)思路一:冒泡排序,先排序后遍历(时间复杂度O(n²),不符合题意)

int missingNumber(int* nums, int numsSize){ for(int i=0;i 
     
       nums[j+1]) { int tmp=nums[j]; nums[j]=nums[j+1]; nums[j+1]=tmp; } } } if(nums[0]!=0) return 0; if(numsSize!=1) { for(int i=0;i 
       
     

虽然力扣题目要求了时间复杂度,但是力扣后台是不会测试复杂度的。只要代码能通过就行。

主要思想:对数组先进行冒泡排序,排序后让数组后一个元素减去前一个元素,若结果等于2,则nums[i]+1则为结果,注意此处需要举出特例。

【C语言】超详细的移位、位操作符详解(含力扣实战)(2)思路二:(0-n的等差数列和)-(数组nums的和)

int missingNumber(int* nums, int numsSize){ int sum1=(0+numsSize+1)*numsSize/2;//sum1为0-n的等差数列求和,首项为0,末项为numsSize+1 int sum2=0;//sum2为缺失数组的和 for(int i=0;i 
     

【C语言】超详细的移位、位操作符详解(含力扣实战)(3)思路三——异或

异或原理:二进制位相同为0,相异为1,两个相同的数字异或,结果为0;故可通过异或的方式找出缺失的数字。原理图与代码如下:

int missingNumber(int* nums, int numsSize){ int ret=0;//缺失的数字 for(int i=0;i 
     

关注!点赞!评论!收藏!关注!点赞!评论!收藏!关注!点赞!评论!收藏!关注!点赞!评论!收藏!关注!点赞!评论!收藏!

【C语言】超详细的移位、位操作符详解(含力扣实战)

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/219907.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月17日 下午9:36
下一篇 2026年3月17日 下午9:37


相关推荐

  • 特立独行的理解_幸福在一起第14集

    特立独行的理解_幸福在一起第14集原题链接对一个十进制数的各位数字做一次平方和,称作一次迭代。如果一个十进制数能通过若干次迭代得到 1,就称该数为幸福数。1 是一个幸福数。此外,例如 19 经过 1 次迭代得到 82,2 次迭代后得到 68,3 次迭代后得到 100,最后得到 1。则 19 就是幸福数。显然,在一个幸福数迭代到 1 的过程中经过的数字都是幸福数,它们的幸福是依附于初始数字的。例如 82、68、100 的幸福是依附于 19 的。而一个特立独行的幸福数,是在一个有限的区间内不依附于任何其它数字的;其独立性就是依附于它的的幸福数

    2022年8月8日
    9
  • 黑马ssm项目_黑马程序员社区

    黑马ssm项目_黑马程序员社区上传到https://github.com/ahn6666/ssm2021.6.13

    2025年6月18日
    4
  • goland永久激活3月最新在线激活[通俗易懂]

    goland永久激活3月最新在线激活,https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月15日
    70
  • 算法系列之九:计算几何与图形学有关的几种常用算法(一)

    算法系列之九:计算几何与图形学有关的几种常用算法(一)我的专业是计算机辅助设计(CAD),算是一半机械一半软件,《计算机图形学》是必修课,也是我最喜欢的课程。热衷于用代码摆平一切的我几乎将这本教科书上的每种算法都实现了一遍,这种重复劳动虽然意义不大,但是收获很多,特别是丢弃了多年的数学又重新回到了脑袋中,算是最大的收获吧。尽管已经毕业多年了,但是每次回顾这些算法的代码,都觉得内心十分澎湃,如果换成现在的我,恐怕再也不会有动力去做这些事情了。

    2025年6月8日
    3
  • Vue(8)列表渲染v-for[通俗易懂]

    Vue(8)列表渲染v-for[通俗易懂]循环在模板中可以用v-for指令来循环数组,对象等。循环数组我们可以用v-for指令基于一个数组来渲染一个列表。v-for指令需要使用iteminitems形式的特殊语法,其中it

    2022年7月31日
    9
  • e签宝上线esign-automation skill,为OpenClaw注入自动电子签署新能力

    e签宝上线esign-automation skill,为OpenClaw注入自动电子签署新能力

    2026年3月13日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号