不用选择分支找出指定两整数中的最大值与最小值:

int x;
int y;    // 找出x与y的最大值与最小值
int r;  // r保存结果

r = y ^ ((x ^ y) & -(x < y)); // min(x, y)

在一些很少的机器上,分支比较很耗资源,而且没有条件移动指令存在,以上的实现可能比传统的方法: r = (x < y) ? x : y 要快。

即使比后者多执行两步指令。(通常,前面的方法要快)

它的工作原理如下:

如果x<y,那么-(x-y)全部为1, 结果 r = y ^ (x ^ y) & ~0 = y ^ x ^ y = x.

否则,如果x >= y, 那么 -(x < y) 全部为0,结果 r = y ^ ((x ^ y) & 0) = y.

在某些机器上,计算(x<y)判断为0还是1需要选择分支判断指令,所以在这样的机器上上面的方法就没有优势可言。

若果要找到最大值,可以使用如下方法:

r = x ^ ((x ^ y) & -(x < y)); // max(x, y)                                                    

快速的方法:

如果大家知道INT_MIN <= x - y <= INT_MAX,可以使用下面快速的方法,因为(x-y)只用计算一次

r = y + ((x - y) & ((x - y) >> (sizeof(int) * CHAR_BIT - 1))); // min(x, y)
r = x - ((x - y) & ((x - y) >> (sizeof(int) * CHAR_BIT - 1))); // max(x, y)

注意到1989 ANSI C说明书没有指定有符号右移,所以上上述方法不稳定,如果抛出溢出异常,于是在做减法操作的时候,x与y的值应该指定为无符号或是转换为无符号类型,以避免没有必要的异常抛出。

转载于:https://www.cnblogs.com/xueda120/archive/2013/05/03/3068215.html

C语言中的位操作(3)--两整数中的最大值与最小值相关推荐

  1. max日期最大值为0_C语言编写程序输出10个整数中最小值或最大值

    C语言编写程序输出10个整数中最小值或最大值 这是一个比较基础,同时也包含C语言中诸多特点的程序,仔细体会有很多的格式规则和技巧.其中包括:输入语句,输出语句,数组,分支结构,循环结构.希望广大C语言 ...

  2. c语言一个整数各位数字个数_C语言编写程序输出10个整数中最小值或最大值

    C语言编写程序输出10个整数中最小值或最大值 这是一个比较基础,同时也包含C语言中诸多特点的程序,仔细体会有很多的格式规则和技巧.其中包括:输入语句,输出语句,数组,分支结构,循环结构.希望广大C语言 ...

  3. c语言只能最大值不能最小值,用c语言编写输入10个无序的整数,去掉一个最大值和最小值,然后求其平均值...

    用c语言编写"输入10个无序的整数,去掉一个最大值和最小值,然后求其平均值"以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我 ...

  4. 4.编程打印一个二维数组中所有元素的和,并打印最大值,最小值(以及它们所在的行号和列号)

    /*晕呀,竟然做了一天,还不知道怎样做出来的.....*/ package HomeWork; import java.util.Arrays; /*4.编程打印一个二维数组中所有元素的和,并打印最大 ...

  5. C语言学习之输出10个整数中的最大值及其下标、最小值及其下标

    1.试编程从键盘输入10个整数并保存到数组,输出10个整数中的最大值及其下标.最小值及其下标. #include <stdio.h> void main(){int a[10],i;int ...

  6. C语言练习题:统计 N 个整数中,大于零或小于零的整数个数(数组)

    实现函数,统计 N 个整数中,大于零或小于零的整数个数 函数定义 int count_plus_or_nega(int numbers[], int n, int plus_or_nega); 参数说 ...

  7. day12.3 C语言初阶——求10 个整数中最大值

    day12.3 谁能横刀立马,唯我飞牛大将军! 求10 个整数中最大值 #include<stdio.h>#include<windows.h>#pragma warning ...

  8. C语言加强学习营(二):定义整型的最大值和最小值

    示例 #include <stdio.h> #include <stdint.h>int main(int argc, char **argv) {uint8_t uint8_ ...

  9. Java编程——输入6个整数,输出最大值和最小值

    此次代码可实现输入6个整数,输出这组数的最大值和最小值. import java.util.Scanner;public class demo9 {public static void main(St ...

  10. 既是回文数又是质数c语言,素数回文——输出两整数之间所有既是回文数又是素数的数 C++实现...

    问题分析与算法设计 所谓回文素数是指,对一个整数n从左向右和从由向左读其结果值相同且是素数,即称n为回文素数.所以本题的重点不是判断素数的方法,而是求回文整数.构造回文数的方法很多,这里仅介绍一种最简 ...

最新文章

  1. 中科院自动化所余山:对大脑的未知,并不阻碍借鉴大脑,成就智能
  2. linux php ftp扩展,Linux中如何安装 PHP 扩展?(方法介绍)
  3. buu 传统知识+古典密码
  4. php修改html,关于html:用PHP设置innerHTML?
  5. How to Fix “Username is not in the sudoers file. This incident will be reported” in Ubuntu
  6. 第六十九期:【学习分享】温水里的程序员,技术将成为温水
  7. Cloudflare配置网站免费CDN加速使用教程
  8. 微软建议用户关闭Win7桌面小工具和侧边栏
  9. HDU 4287 Intelligent IME 水题
  10. edge扩展下载失败或edge报错0x80072ee7
  11. 常见鸟的种类及特点_湿地鸟类种类及分布特点
  12. Python百度文库爬虫之doc文件
  13. React简介--尚硅谷react全家桶笔记总结
  14. 多双系统下蓝牙键盘鼠标的共享配对问题解决办法:win + debian + arch~IRK、LTK、ERand、EDIV、CSRK
  15. 腾讯云函数要收费了,试试阿里云的云效codeup吧,这里有教程
  16. 数模国赛计算机要学什么,数学建模国赛经验分享
  17. 数据库资源博客---小麦苗BEST
  18. Android监听电池电量
  19. DVB-条件接收系统(CAS)
  20. MyBatis学习笔记(六)——高级查询之一对多映射

热门文章

  1. Makefile中变量赋值方式
  2. yarn-site.xml相关配置参数
  3. 如果抛开 Spring,如何自己实现 AOP?面试必问!
  4. 干掉 SQL 中的 like,我用 es 后运营小姐姐们都说好快!
  5. 我的天哪!字节跳动是这样做 Code Review 的
  6. 36 岁程序员应聘被公司领导直接拒绝;B 站面试官回应北邮校招中的不当言论
  7. MySql 不香了?我们公司为什么放弃MySql选择NewSql?
  8. 某IT公司的面试题,难度系数“爆表”。。。
  9. 又一个程序员在工位上倒下了!
  10. 程序员在网吧办公是什么感觉?网友:在被打的边缘疯狂试探!