C语言中的位操作(3)--两整数中的最大值与最小值
不用选择分支找出指定两整数中的最大值与最小值:
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)--两整数中的最大值与最小值相关推荐
- max日期最大值为0_C语言编写程序输出10个整数中最小值或最大值
C语言编写程序输出10个整数中最小值或最大值 这是一个比较基础,同时也包含C语言中诸多特点的程序,仔细体会有很多的格式规则和技巧.其中包括:输入语句,输出语句,数组,分支结构,循环结构.希望广大C语言 ...
- c语言一个整数各位数字个数_C语言编写程序输出10个整数中最小值或最大值
C语言编写程序输出10个整数中最小值或最大值 这是一个比较基础,同时也包含C语言中诸多特点的程序,仔细体会有很多的格式规则和技巧.其中包括:输入语句,输出语句,数组,分支结构,循环结构.希望广大C语言 ...
- c语言只能最大值不能最小值,用c语言编写输入10个无序的整数,去掉一个最大值和最小值,然后求其平均值...
用c语言编写"输入10个无序的整数,去掉一个最大值和最小值,然后求其平均值"以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我 ...
- 4.编程打印一个二维数组中所有元素的和,并打印最大值,最小值(以及它们所在的行号和列号)
/*晕呀,竟然做了一天,还不知道怎样做出来的.....*/ package HomeWork; import java.util.Arrays; /*4.编程打印一个二维数组中所有元素的和,并打印最大 ...
- C语言学习之输出10个整数中的最大值及其下标、最小值及其下标
1.试编程从键盘输入10个整数并保存到数组,输出10个整数中的最大值及其下标.最小值及其下标. #include <stdio.h> void main(){int a[10],i;int ...
- C语言练习题:统计 N 个整数中,大于零或小于零的整数个数(数组)
实现函数,统计 N 个整数中,大于零或小于零的整数个数 函数定义 int count_plus_or_nega(int numbers[], int n, int plus_or_nega); 参数说 ...
- day12.3 C语言初阶——求10 个整数中最大值
day12.3 谁能横刀立马,唯我飞牛大将军! 求10 个整数中最大值 #include<stdio.h>#include<windows.h>#pragma warning ...
- C语言加强学习营(二):定义整型的最大值和最小值
示例 #include <stdio.h> #include <stdint.h>int main(int argc, char **argv) {uint8_t uint8_ ...
- Java编程——输入6个整数,输出最大值和最小值
此次代码可实现输入6个整数,输出这组数的最大值和最小值. import java.util.Scanner;public class demo9 {public static void main(St ...
- 既是回文数又是质数c语言,素数回文——输出两整数之间所有既是回文数又是素数的数 C++实现...
问题分析与算法设计 所谓回文素数是指,对一个整数n从左向右和从由向左读其结果值相同且是素数,即称n为回文素数.所以本题的重点不是判断素数的方法,而是求回文整数.构造回文数的方法很多,这里仅介绍一种最简 ...
最新文章
- 中科院自动化所余山:对大脑的未知,并不阻碍借鉴大脑,成就智能
- linux php ftp扩展,Linux中如何安装 PHP 扩展?(方法介绍)
- buu 传统知识+古典密码
- php修改html,关于html:用PHP设置innerHTML?
- How to Fix “Username is not in the sudoers file. This incident will be reported” in Ubuntu
- 第六十九期:【学习分享】温水里的程序员,技术将成为温水
- Cloudflare配置网站免费CDN加速使用教程
- 微软建议用户关闭Win7桌面小工具和侧边栏
- HDU 4287 	Intelligent IME 水题
- edge扩展下载失败或edge报错0x80072ee7
- 常见鸟的种类及特点_湿地鸟类种类及分布特点
- Python百度文库爬虫之doc文件
- React简介--尚硅谷react全家桶笔记总结
- 多双系统下蓝牙键盘鼠标的共享配对问题解决办法:win + debian + arch~IRK、LTK、ERand、EDIV、CSRK
- 腾讯云函数要收费了,试试阿里云的云效codeup吧,这里有教程
- 数模国赛计算机要学什么,数学建模国赛经验分享
- 数据库资源博客---小麦苗BEST
- Android监听电池电量
- DVB-条件接收系统(CAS)
- MyBatis学习笔记(六)——高级查询之一对多映射