位运算例子

来源:互联网 发布:网络大V发布谣言 编辑:程序博客网 时间:2024/05/22 07:52
题目1:从键盘上输入1个正整数给int变量num,输出由8~11位构成的数(从低0号开始编号)
基本思路:
1.截取8~11位的数,位移到0~3位
a)构建8~11位上为1其余为0的数
b)位与输入数
c)得到的结果右移8位
2.先将8~11位移到0~3位,截取0~3位
a)输入数右移8位
b)构建0~3位为1其余为0的数
c)位与,得到结果
 
仔细考察构建的辅助数(位与时用到的数,因为起到了“采用某些位,无视,即屏蔽其他位”的左右,所以也叫做mask),
构建mask的复杂程度,这里采用方案2
 
main()
{   
       int num, mask;
       printf("Input a integer number: ");
       scanf("%d",&num);
       /*将num右移8位,将8~11位移到低4位上*/
       num >>= 8;        
       /*间接构造1个低4位为1、其余各位为0的整数*/
       mask = ~ ( ~0 << 4);   
       //打印结果
       printf("result=0x%x\n", num & mask);
 }
 
程序运行情况:
          Input a integer number:1000 ←┘
          result=0x3
程序说明:~ ( ~0 << 4)
            按位取0的反,为全1;左移4位后,其低4位为0,其余各位为1;
            再按位取反,则其低4位为1,其余各位为0。这个整数正是我们所需要的。
 
 
题目2:从键盘上输入1个正整数给int变量num,按二进制位输出该数。
   
思路:即将整数从31位到第0位依次输出。如果是高电平输出字符1,否则输出0。
方案1,掩码(mask)变动,原整数不动
a)构建掩码1<<31(31这个数值是否合适?)
b)位与正整数,能得到原整数第31位上的值
c)构建掩码1<<30,用来得到30位上的情况
d)循环
方案2,原整数变动,掩码不动
a)构建掩码1<<sizeof(int)-1(这里优先级有没有问题?)
b)位与正整数,能得到原整数第31位上的值
c)将原整数左移一位,那么再与mask位与的结果就是原整数的第30位的值
d)循环
 
 
#include  "stdio.h"
main()
{
       int num, mask, i;
       printf("Input a integer number: ");
       scanf("%d",&num);
       /*构造1个最高位为1、其余各位为0的整数(屏蔽字)*/
       mask = (1<<sizeof(int) – 1); 
       printf("%d=" , num);
       for(i=1; i<= sizeof(int); i++)
       {
putchar(num&mask ? ’1’ : ‘0’); /*输出最高位的值(1/0)*/
           num <<= 1;  /*将次高位移到最高位上*/
           if( i%4==0 ) putchar(‘,’); /*四位一组,用逗号分开*/
        }
       printf("\bB\n");
    }
 
程序运行情况:
          Input a integer number:1000
          1000=0000,0011,1110,1000B
原创粉丝点击