C语言位操作
2016-06-10 10:20
696 查看
一. 位操作运算符:
1. 按位与&: 有0则0, 全1为1.
格式: 数1&数2; 如:5&4=4;
使用: (1). 清零特定位.
(2). 取某数中的指定位.
2. 按位或 |: 有1则1, 全0为0.
格式: 数1 | 数2; 如: 10 | 5 = 15;
使用: 将操作数某些位 置为1, 其他位不变.
3. 异或^: 参与运算的两数各对应的近位异或, 当对应的二进制位值相异时为1, 否则为0(相同为0, 不同为1).
格式: 数1^数2; 如: 10^5=15;
使用: (1). 使特定位的值取反.
(2). 不引入第三变量, 交换两个变量的值.
(3). 与0异或保留原值, 与1异或取反.
(4). 与自身相异或, 则全部清零, 如: a^a;
4. 左移运算 << : 把”<<”左边的运算数的各二进位全部左移n位, 高位丢弃, 低位补0.
int a=0;
a=a<<2; <==> a=a*4;
使用: 左移一位相当于*2, 效率比”*”更加高.
5. 右移运算 >>: 把“>>” 左边的运算数的各二进制全部右移n位, 低位丢弃.
使用: 相当于 /2, 效率比”/”更高.
二. 位运算模板: 对一个int类型的整数最后四位清零.
16位: a & 0xF0;
32位: a & 0xFFF0;
三. 其他:
1. 把一个16位的整数的各个位数求和, 每4位为一个数, 用函数写出来.
void Show()
{
int i=0;
int nNum=0001 1100 1010 0101;
int nTemp=0;
for(i=0;i<4;++i)
{
nTemp=nNum& 0x000F;
nNum+=nTemp;
nNum=nNum>> 4;
}
}
2. 浮点数存储格式:
如: 20.5
①. (20.5)5 = (10100.1)2;
※ 小数部分如何存: 0.5*2=1.0; 1拿出来保存.
为什么小数没有精确度: 拿0.3如何保存来举例.
0.3*2=0.6; 0拿出来保存, 剩下0.6.
0.6*2=1.2; 1拿出来保存, 剩下0.2.
0.2*2=0.4; 0拿出来保存, 剩下0.4.
0.4*2=0.8; 0拿出来保存, 剩下0.8.
0.8*2=1.6; 1拿出来保存, 剩下0.6.
②. 10100.1 ==> 1.01001*24;
③. 4+127=131;
④. 131 ==> 10000011; (二进制)
⑥. 0 + 10000011 + 0100 + 0000 ……(补齐位数)
转成16位进制得出结果为: 41 +A4+ 00+ 00…
1. 按位与&: 有0则0, 全1为1.
格式: 数1&数2; 如:5&4=4;
使用: (1). 清零特定位.
(2). 取某数中的指定位.
2. 按位或 |: 有1则1, 全0为0.
格式: 数1 | 数2; 如: 10 | 5 = 15;
使用: 将操作数某些位 置为1, 其他位不变.
3. 异或^: 参与运算的两数各对应的近位异或, 当对应的二进制位值相异时为1, 否则为0(相同为0, 不同为1).
格式: 数1^数2; 如: 10^5=15;
使用: (1). 使特定位的值取反.
(2). 不引入第三变量, 交换两个变量的值.
(3). 与0异或保留原值, 与1异或取反.
(4). 与自身相异或, 则全部清零, 如: a^a;
4. 左移运算 << : 把”<<”左边的运算数的各二进位全部左移n位, 高位丢弃, 低位补0.
int a=0;
a=a<<2; <==> a=a*4;
使用: 左移一位相当于*2, 效率比”*”更加高.
5. 右移运算 >>: 把“>>” 左边的运算数的各二进制全部右移n位, 低位丢弃.
使用: 相当于 /2, 效率比”/”更高.
二. 位运算模板: 对一个int类型的整数最后四位清零.
16位: a & 0xF0;
32位: a & 0xFFF0;
三. 其他:
1. 把一个16位的整数的各个位数求和, 每4位为一个数, 用函数写出来.
void Show()
{
int i=0;
int nNum=0001 1100 1010 0101;
int nTemp=0;
for(i=0;i<4;++i)
{
nTemp=nNum& 0x000F;
nNum+=nTemp;
nNum=nNum>> 4;
}
}
2. 浮点数存储格式:
如: 20.5
①. (20.5)5 = (10100.1)2;
※ 小数部分如何存: 0.5*2=1.0; 1拿出来保存.
为什么小数没有精确度: 拿0.3如何保存来举例.
0.3*2=0.6; 0拿出来保存, 剩下0.6.
又回到了0.6一直做这种循环运算 |
0.2*2=0.4; 0拿出来保存, 剩下0.4.
0.4*2=0.8; 0拿出来保存, 剩下0.8.
0.8*2=1.6; 1拿出来保存, 剩下0.6.
②. 10100.1 ==> 1.01001*24;
③. 4+127=131;
④. 131 ==> 10000011; (二进制)
⑥. 0 + 10000011 + 0100 + 0000 ……(补齐位数)
转成16位进制得出结果为: 41 +A4+ 00+ 00…
相关文章推荐
- 如何组织构建多文件 C 语言程序(二)
- 如何写好 C main 函数
- Lua和C语言的交互详解
- 关于C语言中参数的传值问题
- 简要对比C语言中三个用于退出进程的函数
- 深入C++中API的问题详解
- 基于C语言string函数的详解
- C语言中fchdir()函数和rewinddir()函数的使用详解
- C语言内存对齐实例详解
- C语言编程中统计输入的行数以及单词个数的方法
- C语言自动生成enum值和名字映射代码
- C语言练习题:自由落体的小球简单实例
- 使用C语言判断英文字符大小写的方法
- c语言实现的带通配符匹配算法
- C语言实现顺序表基本操作汇总
- C语言中进制知识汇总
- C语言判断一个数是否是2的幂次方或4的幂次方
- C语言中计算正弦的相关函数总结
- 使用C语言详解霍夫曼树数据结构
- C语言实现选择排序、冒泡排序和快速排序的代码示例