关于按位运算符的练习题 希望能给各位初学者一点帮助
相信大家在初学按位运算符的时候都会遇到这样一个让你将16进制的ABC翻转为CBA的题目,对于将按位运算符运用到变量中时,作为新手的我一开始也很迷惑,不过经过了多次运算测试。。。。终于能分析出其代码的流程了,下面我将这段代码与分析写出来,以便于各位和我一样的新手能充分理解。代码如下:
/* 程序3.10 学习按位运算符 */
#include <stdio.h>
void main()
{
unsigned int original=0xABC; /*声明一个无符号int整型变量“原型”的初始值为16进制的10 11 12 */
unsigned int result=0; /*声明一个无符号int整型变量“结果”的初始值为 0 */
unsigned int mask=0xF; /*声明一个无符号int整型变量“掩码”的初始值为16进制的 15 */
printf("\n 原型 = %X",original); /*输出“原型”的初始值ABC转换成16进制为10 11 12 */
result|=original&mask; /*result按位或original和mask的值 得到结果:0000 0000 0000 1100 */
original>>=4; /*original按位右移4位 得到结果:0000 0000 1010 1011 */
result<<=4; /*result按位左移4位 得到结果:0000 0000 1100 0000 */
result|=original&mask; /*result按位或original和mask的值 得到结果:0000 0000 1100 1011 */
original>>=4; /*original按位右移4位 得到结果:0000 0000 0000 1010 */
result<<=4; /*result按位左移4位 得到结果:0000 1100 1011 0000 */
result|=original&mask; /*result按位或original和mask的值 得到结果:0000 1100 1011 1010 */
printf("\t\a结果 = %X \n\n",result); /*二进制数 0000 1100 1011 1010 转换为16进制是 12 11 10 也就是CBA */
}
分析:其实我在注释里面就已经列出了分析,不过便于大家理解,我将其所有步骤都写出来。
首先第一步将变量original的16进制值转换成二进制:0000 1010 1011 1100 ;result转换成二进制:0000 0000 0000 0000 ;mask转换成二进制: 0000 0000 0000 1111
1.第一组运算
(1)result|=original&mask;
0000 1010 1011 1100
&
0000 0000 0000 1111
--------------------
0000 0000 0000 1100
|
0000 0000 0000 0000
--------------------
0000 0000 0000 1100(result结果1)
(2)original>>=4;
0000 1010 1011 1100
>>4
--------------------
0000 0000 1010 1011(original结果1)
(3)result<<4;
0000 0000 0000 1100
<<4
-------------------
0000 0000 1100 0000(result结果2)
2.第二组运算
(1)result|=original&mask;
0000 0000 1010 1011
&
0000 0000 0000 1111
--------------------
0000 0000 0000 1011
|
0000 0000 1100 0000
--------------------
0000 0000 1100 1011(result结果3)
(2)original>>=4;
0000 0000 1010 1011
>>4
--------------------
0000 0000 0000 1010(original结果2)
(3)result<<=4;
0000 0000 1100 1011
<<4
--------------------
0000 1100 1011 0000(result结果4)
3.最后一组运算
(1)result|=original&mask;
0000 0000 0000 1010
&
0000 0000 0000 1111
--------------------
0000 0000 0000 1010
|
0000 1100 1011 0000
-------------------
0000 1100 1011 1010(result结果5)
最后将result的结果5从二进制转换成16进制得出数值 12 11 10,也就是CBA.希望能给大家帮助。