C语言位操作

本文介绍了二进制数的表示和运算,包括反码、补码的概念,二进制加减乘除的规则,以及浮点数的表示方法。此外,还详细讲解了C语言中的按位逻辑运算符,如&、^、|,以及移位运算符。同时提到了C++中的bitset类在处理二进制位操作时的作用。
摘要由CSDN通过智能技术生成

目录

相关字节知识

数制与二进制数

二进制反码

二进制补码

二进制加减乘除

二进制加减法可转换为补码加法

补码加法的溢出检查规则

二进制乘法

十进制转换二进制数

浮点数表示法

十进制整数转二进制数

十进制小数转二进制数

十进制混合小数转二进制数

八、十六进制转二进制数

C语言按位运算符

1.按位逻辑运算符

2.移位运算符

C++中的bitset

lowbit函数


相关字节知识

c语言用字节(byte)表示存储系统字符集所需的大小,所以c字节可能是8/9/16位或其他值。

描述存储器芯片/数据传输率中所用的字节是8位字节(octet)。

从左到右给这8位编号7-0,对应2指数。

7:高阶位(high-order bit)

0:低阶位(low-order bit)

数制与二进制数

二进制反码

正数反码与原码相同,负数除符号位外逐位取反。

二进制补码

当今最常用的系统:二进制补码——避免+0/-0问题。

正数补码与原码一致,负数补码为反码+1,符号位不变。

二进制加减乘除

二进制加减法可转换为补码加法

X[补]+(±Y[补])。

补码加法的溢出检查规则

若两个同号的数相加得到相反符号的数,则加法结果溢出(超过机器字长)。

二进制乘法

本质是左移和加法。

十进制转换二进制数

浮点数表示法

在计算机中表示一个浮点数,要留出若干位存储二进制分数,其他位存指数。数字的实际值就是二进制小数乘2的指定次幂。

十进制整数转二进制数

除基取余,逆序排列,商零终止。

十进制小数转二进制数

乘基取整,正序排列,余零终止。

十进制混合小数转二进制数

以小数点为界,整数、小数部分分别转换。

例:59.625(10)=111011.101(2)

八、十六进制转二进制数

二进制转八进制:(以小数点为界,分别向前向后)合三为一(不足补零),一分为三。

二进制转十六进制:(以小数点为界,分别向前向后)合三为一(不足补零),一分为三。

十六进制中,a~f表示10~15,大小写都可。

易错:其他进制转二进制时,不能去掉中间的0。

C语言按位运算符

1.按位逻辑运算符

~:二进制反码/按位取反 (优先级==++)

例:~(10011010)==01100101

对每个位:

&:两个位都真才真。(双箭头)

^:两个位只有一个真才真。(单箭头)

|:两个位只要有一个真就真。(有箭头就行)

用法(&):掩码(只显示mask位),关闭mask位,检查位的值((flag&mask)==mask)(按位运算符优先级比==低)。

用法(|):打开mask位。

用法(^):切换mask位。

为防信息漏过边界,掩码宽度应>=所覆盖值

2.移位运算符

移出末端位丢失,空出位用0填充。

左移:<<

右移:>>

(右移有符号型操作结果取决于机器。)

例:(10001010)<<2==00101000

该操作产生新值但不改变其运算对象,除非<<=。

用法:

1.number<<n的值是number*2的n次幂。

2.提取较大单元中的位。

C++中的bitset

  • bitset是C++ STL中的一个类,用于处理二进制位。它可以看作是一个固定长度的二进制数,每一位只能是0或1。bitset可以进行位运算,如与、或、异或、取反等操作,也可以进行位移、计数、查找等操作。bitset的长度是固定的,一旦创建就不能改变。在使用时,需要指定bitset的长度,可以使用整数或常量表达式来指定长度。例如,以下代码创建了一个长度为8的bitset:

    bitset<8> bits;
    

    bitset的常用方法包括:

    • set():将指定位置的二进制位设置为1。

    • reset():将指定位置的二进制位设置为0。

    • flip():将指定位置的二进制位取反。

    • count():返回二进制位中1的个数。

    • any():判断二进制位中是否存在1。

    • none():判断二进制位中是否全为0。

    • all():判断二进制位中是否全为1。

    • operator[]:访问指定位置的二进制位。

    bitset的使用可以简化二进制位运算的代码,提高程序的效率。

lowbit函数

int lowbit(int x) {
    return x&-x;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值