按位操作_C语言快速入门与计算机二级备考
1.前言_C语言快速入门与计算机二级备考2.基础知识_C语言快速入门与计算机二级备考3.数据与量_C语言快速入门与计算机二级备考4.运算类型_C语言快速入门与计算机二级备考5.输入与输出_C语言快速入门与计算机二级备考6.判断与循环_C语言快速入门与计算机二级备考7.函数_C语言快速入门与计算机二级备考8.数组_C语言快速入门与计算机二级备考9.指针_C语言快速入门与计算机二级备考10.结构与联合_C语言快速入门与计算机二级备考11.字符串_C语言快速入门与计算机二级备考12.文件操作_C语言快速入门与计算机二级备考
13.按位操作_C语言快速入门与计算机二级备考
14.内存管理_C语言快速入门与计算机二级备考15.可变数组_C语言快速入门与计算机二级备考16.链表_C语言快速入门与计算机二级备考17.宏观控制_C语言快速入门与计算机二级备考18.附录_C语言快速入门与计算机二级备考按位运算
- 按位运输的对象只能说整型或者字符型数据
按位运算符
-
&
按位的与比较两个二进制数据的每一位,若对应的两位都是1则得1,其它情况则为0
应用:
- 让某一位变为0:如&0xFE->111111110,其它数与之进行与运算,最后一位一定变成0,而前7位保留原值
- 取一个数中的一段:&0xFF->11111111,其它数与之进行与运算保留原值,而一个int中其它字节的内容变为0
-
|
按位的或比较两个二进制数据的每一位,若对应的两位有一个是1则得1,否则得0
应用:
- 使得一位或几位为1:如|0x01->00000001,或运算后最后一位变为1,其它位保留原值
- 把两个数拼起来:如0x00FF|0xFF00,或运算后得0xFFFF
-
~
按位取反每一个比特取反(与求((20241111220037-9ary9v3 "补码"))不同)
-
^
按位的异或C中没有表示幂次的符号,^不代表数学中的上标
比较两个二进制数据的每一位,两个位相等,那么结果为0,不相等,结果为1
应用:
- 两个相等的数,异或运算后得0
- 加密:对一个变量异或两次(即每个位翻转两次),等于什么都没做
-
<<
左移i<<j
将i中所有的位向左移动j位,右侧空处填0所有小于int的类型,移位以int的方式做,结果是int
x<<1
等价于x乘2;x<<n
等价于x乘2n;最多能移的位数取决于int的大小 -
>>
右移i>>j
i中所有的位向右移j位,同样以int的方式来做,结果为int对于
unsigned
类型,左边空位填0,但对于有符号的signed
类型,左侧填入原来的最高位以保证符号不变,例如1000在右移后为0100,由负数变成正数,故实际右移后为1100x>>1
等价于x÷2;x>>n
等价于x÷2n -
移位的位数不要用复数,这是没有定义的行为
逻辑运算与按位运算区别
-
对于逻辑运算,它只看到0和1两个值
-
可以认为逻辑运算相当于把所有非0值都变成1,然后做按位运算;例如:
按位运算:
5&4
得到4(0101&0100->0100)逻辑运算:
5&&4
相当于1&1,得到1
位运算的应用
-
输出一个数的二进制:八进制/十六进制都可直接输出,但二进制不行
int num; scanf("%d",&num); unsigned mask =1u<<31;//让mask等于无符号1左移31位,得到一个最高位为1,其余为0的数,即1000…… for (;mask;mask>>=1)//当mask存在时进行循环,循环每一轮mask要右移一位 //即从1000……,进行一次循环后变成0100…… //当所有位都走完后,数字变成00……00,循环结束 { printf("%d",num&mask?1:0);//每次循环将mask与数字进行与运算 //num上与maskd的1对应的那一位是1时,得非0的数,否则得到0 }
位段
- 当需要一次操作不止一位时,可以利用位段,把一个int的若干位组合成一个结构
-
struct U0 { unsigned int leading : 3 ; unsigned int FLAG1 : 1 ; unsigned int FLAG2 : 2 ; int trailing : 27 ; }uu; //这时,sizeof(uu)=4,即一个int,而若结构中所有东西加起来超过32位,则需要多个int uu.leading=2; uu.FLAG1=0; uu.FLAG2=1; uu.trailing=0; void prtbin(unsigned int num)//设此为刚刚输出二进制的函数的函数原型 prtbin(*(int*)&uu);//对这个结构体以整数的方式访问 //最终输出的二进制数为00……010010(共32位) //从左往右 010为leading(3个位),0为FLAG1,01为FLAG2,其余的0为trailing //在定义了位段后,可以直接用位段成员的名称来访问,比上述的按位运算方便
本文来自博客园,作者:无术师,转载请注明原文链接:https://www.cnblogs.com/untit1ed/p/18547860
本文使用知识共享4.0协议许可 CC BY-NC-SA 4.0
请注意: 特别说明版权归属的文章以及不归属于本人的转载内容(如引用的文章与图片)除外
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了