编写一个函数getbits,从一个16位的单元中取出某几位(即该几位保留原值,其余位0)。函数调用形式为getbits(value,n1,2)。----简单题目遇到想不到的问题

c语言位运算经典问题:

https://wenku.baidu.com/view/aa4b144410661ed9ad51f3dd.html

位运算屁屁踢:

https://wenku.baidu.com/view/4ed8e1fd1711cc7930b71656.html

近在编写关于C语言位操作的程序,程序的要求如上,具体要求为value为该16位(两个字节)中的数据值,n1为欲取出的起始位,n2为欲取出的结束位,例如:getbits(0101675,5,8)   表示对八进制101675这个数,取出它的从左边起第5位到第8位。

这是相对基础的题目,没有多久编写出了程序,也验证了其结果,是正确的,其中value用unsigned int来定义的,课本上默认unsigned int为16位也就是两个字节,后来意识到我用的操作系统和编译器中unsigned int很可能不是16位的,原因如下:

标准规定,int 的表示范围不能小于 short 的表示范围,long 的表示范围不能小于 int 的表示范围。这就是说 short 型变量占用的空间可能比 int 型变量少,而 long 型变量占用的空间可能比 int 型变量多。16 位(bit)的计算机中,int 和 short 一般都是 16 位,而 long 是 32位;32位的计算机中,short一般是 16 位,而long和int是 32位。TC2(16位的编译器)中,int是16位的;而 Dev-C++(32 位的编译器)中,int 是 32 位的。具体长度的可以由C++编译器的实现厂商自行决定。目前流行的32位C++编译器中,通常int占4字节,short int占2字节。

我自己编写了一个输出语句确认了下,就是printf("%d",sizeof(unsigned int));结果为4,那也就是说我应该用unsigned short int数据类型来定义value变量了,随后就遇到了意想不到的问题了,键盘输入value值,后一直无法正确输出结果来,后来进行排查,定义后赋值value,能够正确运行处结果,看来是输入语句有问题了,后来网上不断的查找解决方案,被这个标题吸引了,
对于短整型scanf函数的奇怪行为(strange behavior of scanf for short int)

网址为:http://www.it1352.com/355925.html,

查看后才发现我用unsigned short int定义了 value值后,输入的时候还是用%d,这样造成了值无法正确输入,需要改成%hd,这个课本中没有提到过,也是遇到这个问题后第一次见的,也算是从错误中不断学习和进步吧。自己编程的程序如下:

#include <stdio.h>
typedef unsigned short int ui16;
int main()
{
ui16 getbits_1(ui16 value,ui16 n1,ui16 n2);//方法一
ui16 getbits_2(ui16 value,ui16 n1,ui16 n2);//方法二
ui16 value;
ui16 a,b;
ui16 result;
printf("请输入要处理的整数:\n");
scanf("%ho",&value);
printf("请输入起始位和结束位:\n");
scanf("%hd,%hd",&a,&b);
printf("截取的数据为:\n");
result=getbits_1(value,a,b);
printf("%ho %hd",result,result);
return ;
}
ui16 getbits_1(ui16 value,ui16 n1,ui16 n2)
{
ui16 a,b,c;
a=value>>(n1);
b=~(~<<(n2-n1+));
c=a&b;
return c;
}
ui16 getbits_2(ui16 value,ui16 n1,ui16 n2)
{
ui16 z;
z=~;
z=(z<<n1)&(z>>(-n2-));
z=value&z;
z=z>>(n1);
return z;
}
#include <stdio.h>

void getbits(unsigned short value, int n1, int n2);

int main(void)
{
int value;
scanf("%o", &value);
printf("Your number is %o, unsigned short is %ld\n", value, sizeof(unsigned short)); getbits(value, , );
return ;
} void getbits(unsigned short value, int n1, int n2)
{
value = value << n1;
value = value >> n1; value = value >> (-n2);
printf("Result = %o\n", value);
}

【C语言】位运算的更多相关文章

  1. C语言位运算

    C语言位运算详解    位运算是指按二进制进行的运算.在系统软件中,常常需要处理二进制位的问题.C语言提供了6个位操作运算符.这些运算符只能用于整型操作数,即只能用于带符号或无符号的char,shor ...

  2. C语言位运算+实例讲解(转)

    按位或 按位与 按位异或 按位取反 左移右移 C语言位运算 有6种: &, | , ^(亦或), >(右移). 注意:参与位运算的元素必须是int型或者char型,以补码形式出现. 按位 ...

  3. C语言位运算详解[转]

    作者:911 说明:本文参考了http://www2.tsu.edu.cn/www/cjc/online/cyuyan/,算是对其的修正,在此将本文列为原创,实有抄袭之嫌疑.甚是惭愧! 位运算是指按二 ...

  4. C语言位运算详解

    位运算是指按二进制进行的运算.在系统软件中,常常需要处理二进制位的问题.C语言提供了6个位操作运算符.这些运算符只能用于整形操作数,即只能用于带符号或无符号的char.short.int与long类型 ...

  5. C语言 位运算

    1G=1024M; 1M=102KB; 1KB=1024B(字节); 1B=8bits(位); #include<stdio.h> #include<stdlib.h> //C ...

  6. C语言位运算详解(转载)

    转载自:http://www.cnblogs.com/911/archive/2008/05/20/1203477.html 位运算是指按二进制进行的运算.在系统软件中,常常需要处理二进制位的问题.C ...

  7. C 语言 ----位运算

    位运算是指按二进制进行的运算.在系统软件中,常常需要处理二进制位的问题.C语言提供了6个位操作 运算符.这些运算符只能用于整型操作数,即只能用于带符号或无符号的char,short,int与long类 ...

  8. C语言位运算、移位运算 经典示例

    概述: C语言的位级运算可以运用到任何“整数”的数据类型上,如char.short.int.long.long long.或者unsigned这样的限定词.基本的位运算有与.或.非.异或等等. C语言 ...

  9. C语言位运算题解

    #include <stdio.h> #include <stdlib.h> #include <string.h> //#define NONBLANK 1 ma ...

  10. 嵌入式C语言位运算之清位置位

    如题,在嵌入式开发中,掌握位运算是节省开发时间和提高开发效率的一种高效方式. 我们不得不去熟悉如何快速掌握位运算这种高效的技巧,接下来看看程序.. #include <stdio.h> # ...

随机推荐

  1. Java基础--JDK的安装和配置

    一.Java平台简述 1.1 Java语言简介 Java是一门面向对象的编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承.指针等概念,因此Java语言具有功能强大和简单易用两 ...

  2. Linux知识要点大全(第三章)

    第三章  Linux基本操作 *主要内容 1:认识root用户 2:Linux下命令的写法 3:Linux关机和重启 4:忘记root密码的处理方法 5.  Linux下的目录结构 6.  查看信息 ...

  3. Puppeteer 截图及相关问题

    Puppeteer 是 Headless Chrome 的 Node.js 封装.通过它可方便地对页面进行截图,或者保存成 PDF. 镜像的设置 因为其使用了 Chromium,其源在 Google ...

  4. JavaScript夯实基础系列(五):类

      JavaScript中没有类,是通过使用构造函数和原型模式的组合来实现类似其它面向对象编程语言中"类"的功能.ES6引入的关键字class,形式上向其它面向对象编程语言靠拢,其 ...

  5. 一套代码小程序&Web&Native运行的探索04——数据更新

    接上文:一套代码小程序&Web&Native运行的探索03 对应Git代码地址请见:https://github.com/yexiaochai/wxdemo/tree/master/m ...

  6. jQuery获取或设置元素的宽度和高度

    jQuery获取或设置元素的宽度和高度: 可使用以下3种方法: 1,jQuery width() 和 height() 方法: 2,innerWidth() 和 innerHeight() 方法: 3 ...

  7. Android Studio教程07-Fragment的使用

    目录 1. Fragment是什么 1.1. 设计原理和实例 2. 创建fragment 2.1. fragment的生命周期 2.2 添加用户界面:融入到Activity中 3. 管理fragmen ...

  8. UI第三方

    自定义下拉刷新控件 - RefreshableView(支持所有控件的下拉刷新)https://blog.csdn.net/cjh_android/article/details/52462367 亲 ...

  9. Spring boot 发送邮件示例

    最近的一个项目中用到了邮件发送,所以研究了一下.将其总结下来. 首先 登录邮箱 -->设置-->POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务--> ...

  10. Spark Streaming 快速入门

    一.简介 1.便于使用 Spark Streaming将Apache Spark的 语言集成API 引入流处理,使您可以像编写批处理作业一样编写流式作业.它支持Java,Scala和Python. 2 ...