编写一个函数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. 万能的Python,还能用来制作高大上的进度条?

    对于开发或者运维来说,使用Python去完成一些跑批任务,或者做一些监控事件是非常正常的情况.那么如何有效的监控任务的进度,除了在任务中加上log外,还能不能有另一种方式来了解任务进展到哪一步了呢? ...

  2. Snipaste多截屏工具软件

    Snipaste是一个简单的截图小工具,可以支持同时截取多张图片,添加标注等等,操作简单方便,解压即用 百度网盘链接: https://pan.baidu.com/s/1YC75DRoLzdeyli1 ...

  3. 阿里ECS配置MSSQL远程连接的坑

    mssql 2012 r2远程配置的相关文档有太多: 如:sql server2012 远程访问设置 这里不做远程配置的设置介绍.这篇随笔存在的意义在于,你除了要设置服务器,还需要到阿里云控制台设置安 ...

  4. element-ui 动态换肤

    1.在安装好 element-ui@2.x 以后,首先安装sass-loader npm i sass-loader node-sass -D 2.安装 element-theme npm i ele ...

  5. K2制作流程

    K2流程制作注意事项 1:分析需求 2:实施 步骤1:绘制流程图 步骤2:添加datafield[必备:ActJumped  IsPass] 步骤3:添加线规则(如下图所示,在添加完毕规则之后,再给同 ...

  6. MySQL 笔记整理(16) --“order by”是怎么工作的?

    笔记记录自林晓斌(丁奇)老师的<MySQL实战45讲> (本篇内图片均来自丁奇老师的讲解,如有侵权,请联系我删除) 16) --“order by”是怎么工作的? 在林老师的课程中,第15 ...

  7. 回顾曾经的自己,献给java初学者的建议

    要不惜代价投资自己,任何对自己的投资都是值得的 要多学习数据结构, 习惯看源码! 一份知识经过n个人的传递早已经不成样子了 遇到问题不要直接百度,百度上那些花里胡哨的东西有用的很少,对症下药才是王道, ...

  8. 解决Spring MVC前台传参中文乱码问题

    在web.xml文件中配置字符编码过滤器: <filter> <filter-name>CharacterEncoding</filter-name> <fi ...

  9. mysql事件调度器使用

    --设置事件调度器 开启SET GLOBAL event_scheduler = ON; --查看事件调度器 是否开启 on开  off关SHOW VARIABLES LIKE 'event_sche ...

  10. connection holder is null新增解决方案(2018-06-02)

    最近在做Java后台的项目,用到了druid数据库连接池,阿里出品,肯定是精品的意思咯,这也是我们老大搭建的框架,我就站在前人的肩膀上飞翔了.先前在一个事物里,使用了多条数据库操作,都是正常的,但是前 ...