C语言开发_位运算深入练习
任务:C语言运算符
数据的存储(练习对数据类型的深入理解)
比如:(1) 将4个字符(任何数据)存放在一个int类型的变量中。
(2) 将4个字符(任何数据)再从变量中取出来。
一个int为4个字节。
一个char为1个字节。
4个字符:’A’ ‘B’ ‘C’ ‘D’
思路:
data=’A’<<’24’;
data=data|(‘B’<<’16’);
封包:将一些数据集成在一起。
解包:拆分。
需要使用的运算符:<<(按位左移) , >>(按位右移) ,| (按位或) ,& (按位与)
示例:
#include <stdio.h> int main() { unsigned int data=0; unsigned char a=55; unsigned char b=66; unsigned char c=77; unsigned char d=88; /*1. 数据存储*/ data=data|(a<<24); data=data|(b<<16); data=data|(c<<8); data=data|(d<<0); // | 规则:有1得1,全0为0 // 0 规则:全1得1,有0为0 /*2. 数据拆分*/ printf("%d\n",data>>24); printf("%d\n",(data>>16)&0xFF); printf("%d\n",(data>>8)&0xFF); printf("%d\n",(data>>0)&0xFF); return 0; } //%c 打印字符。 一个字符1个字节 |
位运算符
>> |
作用:按位(运算时,需要将数据转为二进制格式)向右移 规则:低位溢出,高位补0 3--->0011 15—0xF-->1111 将0xF向右移2位: 0000 1111 00000 01111 (红色部分就是补的0) (蓝色部分就是溢出的数据) |
<< |
作用:按位(运算时,需要将数据转为二进制格式)向左移 规则:高位溢出,低位补0 |
| |
作用:按位或 规则:有1得1,全0为0 0011 0100 0100 1000 0111 1100 |
& |
作用:按位与 规则:全1为1,有0得0 |
组合运算符
+= |
data+=1; 相当于 data=data+1; |
-= |
|
|= |
|
&= |
data&=1; 相当于 data=data&1; |
十进制转二进制。
比如: 3 -->0011
正常使用的语句: if 、for
#include <stdio.h> int main() { // unsigned char data=8; //00001000 unsigned char i; //00010000 00001000 for(i=0;i<8;i++) //i++ == i=i+1 { if(data&0x01) { printf("%d",1); }else { printf("%d",0); } data>>=1; //移除向右移动 data=data>>1; } return 0; } |
基于第6题升级
修改已经存入到int变量里的值。
比如: int 内部存放了: ‘A’ ‘B’ ‘C’ ‘D’
现在需要将’C’改为’H’ ,前提条件是不能修改其他值(‘A’ ‘B’ ‘D’)。
#include <stdio.h> int main() { unsigned int data=0; unsigned char a=55; unsigned char b=66; unsigned char c=77; unsigned char d=88; /*1. 数据存储*/ data|=a<<24; data|=b<<16; data|=c<<8; data|=d<<0; /*2. 数据拆分*/ printf("%d\n",data>>24); printf("%d\n",(data>>16)&0xFF); printf("%d\n",(data>>8)&0xFF); printf("%d\n",(data>>0)&0xFF); //data: 55 66 77 88 /*3. 数据修改*/ data&=0xFF00FFFF; //清除数据 data|=0x007B0000; //加入数据123 /*4. 数据拆分*/ printf("%d\n",data>>24); printf("%d\n",(data>>16)&0xFF); printf("%d\n",(data>>8)&0xFF); printf("%d\n",(data>>0)&0xFF); return 0; } |
- 点赞
- 收藏
- 关注作者
评论(0)