鱼C论坛

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

[学习笔记] 每日一学27

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

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

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

x
位运算3

综合应用——数制转换

例题1:从键盘上输入一个是十进制正整数,按二进制位输出该数。
#include<stdio.h>

int main()
{
    unsigned short a,b,i;       //声明无符号短整型

    printf("请输入一个整型数:");

    scanf("%u",&a);         //输入无符号整形

    b=1<<15;            //构造一个最高位为1、其余各位为0的整数

    printf("%u=",a);

    for(i=1;i<=16;i++)
    {
        putchar(a&b?'1':'0');       //输出最高为的值(1/0)
        a<<=1;                  //将次高位移到最高位上
        if(i%4==0)putchar(',');     //4位一组用逗号分开
    }
    printf("\bB\n");

    return 0;
}

例题分析:
本例题使用按位与配合右移运算,依次输出了二进制的每一位。




位运算总结

按位运算是对字节或字中的实际位进行检测、设置或移位,它只适用于字符型和整数型变量以及它们的变体,对其他数据类型不适用。我们要注意区分运算和逻辑运算。

1.按位与运算
按位与运算符 "&" 是双目运算符,其功能是参与运算的两数各对应的二进位相与。只有对应的两个二进位均为1时,结果位才为1,否则为0。参与运算的数以补码方式出现。
按位与运算通常用来对某些位清0或保留某些位。例如把a的高8位清0,保留低8位,可作a&255运算(255的二进制数为0000000011111111)。

main()
{
           int a=9,b=5,c;
           c=a&b;
           printf("a=%d/nb=%d/nc=%d/n",a,b,c);
}


2.按位或运算
按位或运算符 "|" 是双目运算符,其功能是参与运算的两数各对应的二进位相或。只要对应的2个二进位有一个为1时,结果位就为1。参与运算的两个数均以补码出现。
例如,9|5可写算式00001001|00000101。

00001101(十进制为13)可见9|5=13
main()
{
        int a=9,b=5,c;
        c=a|b;
          printf("a=%d/nb=%d/nc=%d/n",a,b,c);
}

3.按位异或运算
按位异或运算符 "^" 是双目运算符,其功能是参与运算的两数各对应的二进位相异时。结果为1。参与运算数仍以补码出现,例如,9^5可写成算式00001001^00000101=00001100(十进制为12)。

main()
{
        int a=9;
        a=a^15;
        printf("a=%d/n",a);
}

4.求反运算
求反运算 "~" 为单目运算符,具有右结合性,其功能是对参与运算的数的各二进位按位求反。
例如,~9的运算符为~(0000000000001001)结果为1111111111110110。

5.左移运算
左移运算符 "<<" 是双目运算符,其功能把 "<<" 左边的运算数的各二进位全部左移若干位,由 "<<" 右边的数指定移动的位数,高位丢弃,低位补0。
例如,a<<4指把a的各二进位向左移动4位。如a=00000011(十进制3),左移4位后为00110000(十进制48)。

6.右移运算
右移运算符 ">>" 是双目运算符,其功能是把 ">>" 左边的运算数的各二进位全部右移若干位,">>" 右边的数指定移动的位数。
例如,a=15,a>>2表示把00001111右移为00000011(十进制3)。应该说明的是,对于有符号数,在右移时,符号位将随同移动。当为正数时,最高位补0,而为负数时,符号位为1,最高位是补0或是补1取决于编译系统的规定。

main()
{
        unsigned a,b;
        printf("input a number:");
        scanf("%d",&a);
        b=a>>5;
        b=b&15;
        printf("a=%d/tb=%d/n",a,b);
}

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

使用道具 举报

发表于 4 天前 | 显示全部楼层
看起来您提供的代码和文字描述有些不完整和混乱,因此可能导致理解上的困难。让我为您整理一个完整的示例代码,以实现从键盘输入一个十进制正整数,并按二进制格式输出该数:
#include <stdio.h>

int main()
{
    unsigned short a, i;  // 使用无符号短整型存储输入
    printf("请输入一个整型数:");
    scanf("%hu", &a);  // 使用%hu读取无符号短整型

    printf("二进制表示为:");
    for (i = 15; i >= 0; i--) {
        printf("%d", (a >> i) & 1);  // 右移i位并与1逻辑与得到当前位的值
    }
    printf("\n");

    return 0;
}

**解释:**
- 代码中使用了一个循环,通过位移操作将每一位提取出来,并输出该位的值。
- 使用`%hu`来读取`unsigned short`类型的整数。
- `a >> i`表示将`a`右移`i`位。
- `(a >> i) & 1`用于获取`a`的第`i`位(二进制位)的值。
- 从高到低输出二进制位,所以从`i=15`开始。

希望这个示例能够帮助您更好地理解如何进行位运算来实现数制转换。若有任何进一步的问题,请随时询问!

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

使用道具 举报

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

本版积分规则

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

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

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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