关于衡量计算操作的方法:

当为算法统计操作的数量的时候,所有的C运算符被认为是一样的操作。中间过程不被写入随机存储器(RAM)而不被计算,当然,这种操作数的计算方法,只是作为那些接近机器指令和CPU运行时间的服务。所有的操作被假设成花相同的运行时间,事实上是不正确的。有很多不同的因素决定一个系统能多快运行一段样例代码,例如:缓存大小,内存带宽,指令集合等等……。最后,建立一套标准才是衡量一种方法快过另一种方法的最好方法。

判断一个整数的符号:

int v;      // v为我们要判断的整数
int sign;   // 保存结果 sign = -(v < 0);   // if v < 0 sign= -1, else 0. //或者为了避免在cpu上判断而使用寄存器
sign = -(int)((unsigned int)((int)v) >> (sizeof(int) * CHAR_BIT - 1));  // CHAR_BIT 是每字节的位数 (通常为 8).//或者为了减少指令(但不轻便)
sign = v >> (sizeof(int) * CHAR_BIT - 1);

测试代码:

#include<stdio.h>
#include<math.h>
#include<string.h>
#include<ctype.h>
#include<limits.h>int test(int v)
{  //正数返回0,负数返回-1int sign;sign = -(v < 0);  sign = -(int)((unsigned int)((int)v) >> (sizeof(int) * CHAR_BIT - 1));  // CHAR_BIT 是每字节的位数 (通常为 8).sign = v >> (sizeof(int) * CHAR_BIT - 1);return sign;
}int main()
{int v;scanf("%d",&v);printf("%d\n",test(v));getchar();getchar();return 0;
}

评估一下上面最后一个语句:sign = v >> 31 for 32-bit integers,这是一个比常规操作:sign = -(v < 0).更快的方法,这种技巧可行是因为:当有符号整数右移,最左边的位被复制到其他位,最左边的位是1说明这个整数是负数,否则为0则为正数。当所有的位是1的时候返回-1,但是这种行为是面向特定的结构。

又或者你更加喜欢返回的结果为-1或+1,于是有了下面的表达方式:

ign = +1 | (v >> (sizeof(int) * CHAR_BIT - 1));  // 假如v < 0 返回-1, 否则返回 +1

再或者你偏爱结果返回形式是-1,0,+1,可以使用下列表现形式:

sign = (v != 0) | -(int)((unsigned int)((int)v) >> (sizeof(int) * CHAR_BIT - 1));//或者速度更快,但是不轻便
sign = (v != 0) | (v >> (sizeof(int) * CHAR_BIT - 1));  // -1, 0, or +1// 或者轻便、简洁但是也许速度不快
sign = (v > 0) - (v < 0); // -1, 0, or +1

可能你想知道数字是否非负,结果返回值为:+1或者0,于是可以使用sign = 1 ^ ((unsigned int)v >> (sizeof(int) * CHAR_BIT - 1)); // 如果 v < 0  返回 0, 否则返回 1

转载于:https://www.cnblogs.com/cpoint/p/3367380.html

C语言位操作--判断整数的符号相关推荐

  1. C语言位操作--判断整数是否为2的幂

    unsigned int v; // 判断v是否为2的幂 bool f; // f为判断的结果f = (v & (v - 1)) == 0; // 结果为0表示不是2 的幂// 改变表示方法, ...

  2. c语言,判断整数 m 是否素数

    #include<stdio.h> int main() {     int n,i,flag=1;//定义      printf("n=");     scanf( ...

  3. C语言 | C语言深度解剖 ——章节2 符号

    C语言 | C语言深度解剖 --章节2 符号 C语言基本符号表 注释符号 // /* 几个似非而是的注释问题 y=x/*p 出色注释的基本要求 连接符和转义符 \ 单引号.双引号 花括号 运算符 10 ...

  4. 每日算法C语言1-求某整数

    每日算法C语言 题目 一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少? 程序分析: 在10万以内判断,先将该数加上100后再开方,再将该数加上168后再开方如 ...

  5. python判断整数的奇偶性_你不知道的:整数的奇偶性判断

    1奇偶性 奇数可以被定义成被2整除余1的整数.于是想到用语言实现用求模取余即可:i%2==1,但是这样会不会有什么问题呢?看下面的例子: public class IsOdd { public sta ...

  6. C语言条件判断 if / else - C语言零基础入门教程

    目录 一.C 语言条件判断 if 1.if 语法 2.if 实战 二.C 语言条件判断 if / else 1.if / else 语法 2.if / else 实战 三.猜你喜欢 零基础 C/C++ ...

  7. c语言辅音字符怎么表示,C 语言实例 - 判断元音/辅音

    C 语言实例 - 判断元音/辅音 C 语言实例 C 语言实例 判断输入的字母是元音,还是辅音. 英语有26个字母,元音只包括 a.e.i.o.u 这五个字母,其余的都为辅音.y是半元音.半辅音字母,但 ...

  8. c语言整形符号位_C语言中整型无符号二进制数的表示问题

    龙源期刊网 http://www.qikan.com.cn C 语言中整型无符号二进制数的表示问题 作者:马红旭 来源:<电子技术与软件工程> 2015 年第 20 期 摘 要 文章解决的 ...

  9. 偶数乘2奇数乘3C语言,输入一个整数x,如果为偶数乘2,否则乘3,然后输出.C语言

    编写一个程序,输入一个正整数,并做以下运算:如果为偶数,除以2,如果为奇数,乘3加1.得到的结果再按上 本人不会C#,算法相通,用c语言演示一下:#includevoidmain(void){intz ...

最新文章

  1. 如何触发AspxGridview的PageIndexChanged 客户端事件
  2. python 网页cookie的使用
  3. 【很早以前的作品】自编游戏之NationFight
  4. Linux shell变量的命名规范
  5. phpexcel.php linux,phpexcel在linux系统报错如何解决
  6. ASP.NET 操作Cookie详解 增加,修改,删除
  7. js 页面载入时的执行顺序
  8. oracle xe 数据库用户操作
  9. matlab里vpa怎么用_“学校里的师兄师姐,用英文怎么说?”
  10. Python中的时间转换和时间获取
  11. python变量赋值
  12. 基于二叉链表的树结构相等的判断
  13. 域渗透——获取用户明文密码
  14. matlab画一条平滑曲线,Matlab画平滑曲线的两种方法( 拟合或插值后再用plot即可)...
  15. 优秀开源项目之二:流媒体直播系统Open Broadcaster Software
  16. 2020-10-23 集合+序列化+递归+多线程+泛型+枚举+单例+反射小记
  17. Win10家庭版没有权限访问网上邻居,不能连接共享打印机的解决办法
  18. 2023秋招大厂经典面试题及答案整理归纳(161-180)校招必看
  19. 【数据分析】贝叶斯原理
  20. GO语言实现P2P网络-客户端实现并且运行和测试

热门文章

  1. 2023第十届大唐杯省赛心得体会总结
  2. 安装 配置 Nginx
  3. python正负数排序_带有负值的Python sort()问题
  4. 内存分配函数(动态内存分配)详解
  5. linux下设置MySQL密码
  6. grbl源码解析——速度前瞻(2)
  7. 聊一聊 AS 的一些好用的功能
  8. Weakly Supervised Deep Learning for Thoracic DiseaseClassification and Localization on Chest X-rays
  9. Hinton努力推翻自己积累了30年的学术成果,我才知道什么叫生命力!
  10. Qt串口等接口数据协议传输时的字节拼接处理