鱼C论坛

 找回密码
 立即注册
查看: 56|回复: 1

[学习笔记] 每日一学25

[复制链接]
发表于 6 天前 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
位运算2

位运算应用

例题1:分析以下程序的位运算的结果
#include<stdio.h>
int main()
{
    unsigned char a,b,c;            //声明字符类型变量

    a=0x3;          //a是十六进制数

    b=a|0x8;        //按位或

    c=b<<1;         //左移运算

    printf("%d\n%d\n",b,c);

    return 0;
}

例题分析:
变量a的二进制数:(00000011)
0x8的二进制数:(00001000)
变量b的二进制数:
    00000011
|   00001000
    00001011    十进制11的二进制码

变量b左移1位,结果是:(00010110)
所以变量c的值是十进制22。




例题2:取一个整数a的二进制形式从右端开始的4~7位,并以八进制形式输出。
#include<stdio.h>
int main()
{
    unsigned short a,b,c,d;     //声明字符型变量

    scanf("%o",&a);

    b=a>>4;         //右移运算

    c=~(~0<<4);     //取反左移后再取反

    d=b&c;          //按位与

    printf("%o\n%o\n",a,d);

    return 0;

例题分析:
本范例分3步运行,先使a右移4位,然后设置一个低4位全为1、其余全为0的数,可用~(~0<<4),最后将上面二者进行&运算。
我们输入的八进制数是1640,转换为二进制数是 0000001110100000,获取其右端开始的4~7位是二进制数1010,转换为八进制就是12。



例题3:将无符号数a右循环移n位,即将a中原来左面(16-n)位右移n位,即将a中原来左面(16-n)位右移n位,原来右端n位移到最左面n位。
#include<stdio.h>
int main()
{
    unsigned short a,b,c;       //声明字符型变量

    int n;

    scanf("%o,%d",&a,&n);       //输入八进制和十进制

    b=a<<(16-n);                //左移运算

    c=a>>n;                     //右移运算

    c=c|b;                      //按位或

    printf("%o\n%o\n",a,c);     //输出八进制

    return 0;
}

例题分析:
本范例分3步进行,将a,右端的n位先放到b中的高n位中,实现语句b=a<<(16n);将a右移n位,其左面高位n位补0,实现语句c=a>>n;最后c与b进行按位与或运算,即c=c|b。
我们输入的八进制数是1641,转换为二进制数是0000001110100001,获取其循环移3位,结果是0010000001110100,转换为八进制就是20164。

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 6 天前 | 显示全部楼层
位运算是一种非常高效的操作方式,尤其在需要对二进制位进行处理时。我们来分析一下这个例子的位运算结果。代码中存在几个小问题和可能的输入错误,我将按照推测进行解释。
#include <stdio.h> // 缺少的头文件
int main()
{
    unsigned char a, b, c; // 声明字符类型变量

    a = 0x3; // a 是十六进制数,相当于二进制 0011

    b = a | 0x8; // 按位或,0x8 是二进制 1000
    // b = 0011 (a) | 1000 (0x8) = 1011 (即 0xB 或十进制 11)

    c = b >> 4; // 右移运算,将 b 向右移动 4 位
    // b = 1011,右移 4 位后为 0000,c = 0

    c = ~(~0); // 这个操作最终结果是无变化的,举例来说,对于一个 8 位的无符号整型,
    // ~0 应该是全为 1 的二进制数,取反两次还是 0xFF。

    return 0;
}

请注意:
1. `#include`中缺少必要的库文件,比如`<stdio.h>`,否则程序无法正常编译。
2. 运算的每一步只能在 8 位字符的范围内进行,避免了符号位的干扰。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-30 00:06

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表