目录
相关字节知识
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;
}