第十五章 位操作 讲解

运算符: ~  &  |   ^   >>     <<    &=     |=     ^=    >>=     <<=

一个字节通常有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 ,然后位与

 

posted on 2015-10-16 21:18  无悔这一生。  阅读(173)  评论(0编辑  收藏  举报

导航