第十五章 位操作 讲解
运算符: ~ & | ^ >> << &= |= ^= >>= <<=
一个字节通常有8位
#include<stdio.h>
int main()
{
char c='a'; // a转换成十六进制也就是 0x61 ,显然和下面不一样了,只占了 8位, 0110 0001
char d;
int a=7; // 0x0000 0007 ,因为 int是 4个字节,也就是32位 转换成16进制
int b;
b=~a; // 0xffff fff8 ,记住一个F 代表 4位
d=~c; // 0x9e 应该是的,对就是的 ,反过来 便是 1001 1110
}
// 0000 0111 取反 也就是 1111 1000 也就是 f8
//比如是1111 1111 1111 1111 1111 1111 1111 1111 共32
相关编程题:
1、 统计一个char 类型的 数据8位中的 1的个数
1 #include<stdio.h> 2 char BitCount(unsigned char n); 3 int main() 4 { 5 char m=0x61; 6 printf("%d\n",BitCount(m)); 7 8 } 9 10 char BitCount(unsigned char n) 11 { 12 unsigned int c =0 ; // 计数器 13 while (n >0) 14 { 15 if((n &1) ==1) // 当前位是1 16 ++c ; // 计数器加1 17 n >>=1 ; // 移位 18 } 19 return c ; 20 }
0x61 | 0110 0001 |
0x30 | 0011 0000 |
0x18 |
0001 1000 |
0x0c | 0000 1100 |
0x06 | 0000 0110 |
0x03 | 0000 0011 |
0x01 | 0000 0001 |
0x00 | 0000 0000 |
由该图看出最低位0位 为 1 只有3次,所以为 个数为 3
这里用到的是 左移,由 高位向低位移动。然后与 最低位 1 与 ,来判断是不是为 1
网上还有 其他方法,我们先暂且 只考虑这一种方法。
2015.10.16 09:01:57 (学习 | 位或 和 & 位与 用法)
嵌入式系统总是要用户对变量或寄存器进行位操作。给定一个整型变量a,写两段代码,第一个设置a的
bit 3,第二个清除a 的bit 3。在以上两个操作中,要保持其它位不变。对这个问题有三种基本的反应
1). 不知道如何下手。该被面者从没做过任何嵌入式系统的工作。
1 #include<stdio.h> 2 #define BIT (0x01<<2) 3 int main() 4 { 5 int m=7; 6 int n=BIT; 7 m|=BIT; 8 printf("%d\n",m); 9 10 int m=7; 11 12 m&=~BIT; 13 14 printf("%d\n",m); 15 16 }
m | 7 | 0000 0111 | |||
n | 0x01<<2 | 0000 0100 | |||
m|=BIT 位或 | 7 | 0000 0111 | |||
~BIT | 1111 1011 | 1111 1011 | |||
m | 7 | 0000 0111 | |||
m&=~BIT | 3 | 0000 0011 |
从图可以看出 ,要 一个位 置位,其他不变,用 位或
要清除一个位, 其他位设为1 ,清楚位 设为0 ,然后位与