【C语言】位运算
编写一个函数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语言】位运算的更多相关文章
- C语言位运算
C语言位运算详解 位运算是指按二进制进行的运算.在系统软件中,常常需要处理二进制位的问题.C语言提供了6个位操作运算符.这些运算符只能用于整型操作数,即只能用于带符号或无符号的char,shor ...
- C语言位运算+实例讲解(转)
按位或 按位与 按位异或 按位取反 左移右移 C语言位运算 有6种: &, | , ^(亦或), >(右移). 注意:参与位运算的元素必须是int型或者char型,以补码形式出现. 按位 ...
- C语言位运算详解[转]
作者:911 说明:本文参考了http://www2.tsu.edu.cn/www/cjc/online/cyuyan/,算是对其的修正,在此将本文列为原创,实有抄袭之嫌疑.甚是惭愧! 位运算是指按二 ...
- C语言位运算详解
位运算是指按二进制进行的运算.在系统软件中,常常需要处理二进制位的问题.C语言提供了6个位操作运算符.这些运算符只能用于整形操作数,即只能用于带符号或无符号的char.short.int与long类型 ...
- C语言 位运算
1G=1024M; 1M=102KB; 1KB=1024B(字节); 1B=8bits(位); #include<stdio.h> #include<stdlib.h> //C ...
- C语言位运算详解(转载)
转载自:http://www.cnblogs.com/911/archive/2008/05/20/1203477.html 位运算是指按二进制进行的运算.在系统软件中,常常需要处理二进制位的问题.C ...
- C 语言 ----位运算
位运算是指按二进制进行的运算.在系统软件中,常常需要处理二进制位的问题.C语言提供了6个位操作 运算符.这些运算符只能用于整型操作数,即只能用于带符号或无符号的char,short,int与long类 ...
- C语言位运算、移位运算 经典示例
概述: C语言的位级运算可以运用到任何“整数”的数据类型上,如char.short.int.long.long long.或者unsigned这样的限定词.基本的位运算有与.或.非.异或等等. C语言 ...
- C语言位运算题解
#include <stdio.h> #include <stdlib.h> #include <string.h> //#define NONBLANK 1 ma ...
- 嵌入式C语言位运算之清位置位
如题,在嵌入式开发中,掌握位运算是节省开发时间和提高开发效率的一种高效方式. 我们不得不去熟悉如何快速掌握位运算这种高效的技巧,接下来看看程序.. #include <stdio.h> # ...
随机推荐
- Mysql监控工具介绍-Monyog
MONyog监控工具 MONyog是一个优秀的MySQL监控工具,可以实时监测MYSQL服务器,查看MySQL服务器的运行状态. 支持查询分析功能,能够轻松找出有MySQL的问题所在,此外,还可以帮助 ...
- python内置方法大全
数学运算 abs:求数值的绝对值 >>> abs(-2) 2 divmod:返回两个数值的商和余数 >>> divmod(5,2) (2, 1) >> ...
- 机器学习——XGBoost大杀器,XGBoost模型原理,XGBoost参数含义
0.随机森林的思考 随机森林的决策树是分别采样建立的,各个决策树之间是相对独立的.那么,在我们得到了第k-1棵决策树之后,能否通过现有的样本和决策树的信息, 对第m颗树的建立产生有益的影响呢?在随机森 ...
- 进阶!基于CentOS7系统使用cobbler实现单台服务器批量自动化安装不同版本系统(week3_day5_part2)-技术流ken
前言 在上一篇博文<cobbler批量安装系统使用详解-技术流ken>中已经详细讲解了cobbler的使用以及安装,本篇博文将会使用单台cobbler实现自动化批量安装不同版本的操作系统. ...
- SpringBoot系列——Spring-Data-JPA(究极进化版) 自动生成单表基础增、删、改、查接口
前言 我们在之前的实现了springboot与data-jpa的增.删.改.查简单使用(请戳:SpringBoot系列——Spring-Data-JPA),并实现了升级版(请戳:SpringBoot系 ...
- Java虚拟机垃圾收集算法
1.标记-清除算法 标记-清除算法分为 "标记" 和 "清除" 两个步骤:首先标记出所有需要回收的对象,然后在标记完成后统一回收所有被标记的对象,是垃圾收集算法 ...
- nodejs异步转同步
项目在微信环境开发,需要获取access_token进行授权登录和获取用户信息. 特意把这块功能拿出来封装一个自定义module module.exports = new Wechat(con.app ...
- Spring注入对象(3)
2019-03-08/10:45:04 演示:对Product对象,注入一个Category对象 1.创建pojo类 Product类中有对Category对象的setter getter packa ...
- 《JavaScript高级程序设计》笔记:BOM(八)
BOM(浏览器对象模型)提供了很多对象,用于访问浏览器的功能,这些功能与任何网页内容无关. window对象 全局作用域 定义全局变量与在window对象上直接定义属性还是有一点差别:全局变量不能通过 ...
- 关于boostrap的modal隐藏问题(前端框架)
Modal(模态框) 首先,外引boostrap和Jquery的文件环境: <link rel="stylesheet" href="https://cdn.sta ...