利用位运算计算某种数据类型的最大值和最小值
2013-03-28 19:54
274 查看
常见数值的补码
最高位是符号位,0表示正数,1表示负数。
已知负数求补码
方法:将对应绝对值的补码按位取反,然后加上1,比如求-1的补码,先取1的补码:
已知负数的补码,求负数
方法:补码-1,然后按位取反得到绝对值,然后加上负号
也可以直接按位取反,得到绝对值加上1,然后加上负号
再如:
最大值和最小值的特征
从以上补码,可以看出,任何一种数据类型,其最大值的特点是最高位为0,其余为均为1,而最小值,其特点是最高位为1,其余位均为0。因此对于任何一种数据类型,只要通过位移运算,得到符合上述特点的补码就可以获取到相应数据类型的最大值和最小值。现假设要计算短整型的数据范围,则其最大值和最小值的补码如下:
要获得以上补码,我们可以看到,最简单的是获得最小值的补码,它可以通过对1左移15位获得,而如果获得了最小值的补码,那么按位取反,就可以获得最大值的补码,过程如下:
下面是实验:
于是,对于一个对输入的整形数乘以一定倍数的模板函数,可以通过下面的方式确定数值范围:
数值 | 补码 |
0 | 0000 0000 |
1 | 0000 0001 |
-1 | 1111 1111 |
-256 | 1000 0000 |
255 | 0111 1111 |
已知负数求补码
方法:将对应绝对值的补码按位取反,然后加上1,比如求-1的补码,先取1的补码:
0000 0001 | 1 | |
按位取反 | 1111 1110 | |
加上1 | 1111 1111 | -1 |
方法:补码-1,然后按位取反得到绝对值,然后加上负号
1111 1111 | ||
减去1 | 1111 1110 | |
按位取反 | 0000 0001 | 1 |
加上负号 | -1 |
1111 1111 | ||
按位取反 | 0000 0000 | 0 |
加上1 | 1 | |
填上负号 | -1 |
1000 0000 | ||
按位取反 | 0111 1111 | 127 |
加上1 | 128 | |
填上负号 | -128 |
255 | 0111 1111 |
-256 | 1000 0000 |
32768 | 0111 1111 1111 1111 |
-32769 | 1000 0000 0000 0000 |
最大值 | 0111 1111 1111 1111 |
最小值 | 1000 0000 0000 0000 |
0000 0000 0000 0001 | 1 | |
左移15位 | 1000 0000 0000 0000 | -32769 |
按位取反 | 0111 1111 1111 1111 | 32768 |
1<<(sizeof(int)*8-1) -2147483648 ~(1<<(sizeof(int)*8-1)) 2147483647 注意以下差异: (short)(1<<(sizeof(short)*8-1)) -32768 (short)(~(1<<(sizeof(short)*8-1))) 32767 ((short)1)<<(sizeof(short)*8-1) 32768 ~(((short)1)<<(sizeof(short)*8-1)) -32769 ((int)1)<<(sizeof(int)*8-1) -2147483648 ~(((int)1)<<(sizeof(int)*8-1)) 2147483647 ((long)1)<<(sizeof(long)*8-1) -2147483648 ~(((long)1)<<(sizeof(long)*8-1)) 2147483647
于是,对于一个对输入的整形数乘以一定倍数的模板函数,可以通过下面的方式确定数值范围:
template<typename T> int Test(T x,int nScale) { T nMin = (T)(1<<(sizeof(x)*8-1)); //确定该类型的最大值 T nMax = (T)(~(1<<(sizeof(x)*8-1))); //确定该类型的最小值 int nVal = x*nScale; //乘以一定的倍数 if(nVal<nMin) return nMin; //如果越下界,则返回下界值 else if(nVal>nMax) return nMax; //如果越上界,则返回上界值 else return nVal; //没有越界,返回乘倍后的值 }
相关文章推荐
- C# 各种数据类型的最大值和最小值常数
- char、int、short、float等数据类型的最大值和最小值大全
- C++中获取内置数据类型最大值、最小值的模板类
- Java 基本数据类型最大值极限和最小值极限
- java位运算(二),了解各个类型的最大最小值,以及怎么计算出来的
- Java 基本数据类型最大值极限和最小值极限
- limits.h_判断某种特定类型可以容纳的最大值或最小值
- Java 基本数据类型最大值极限和最小值极限
- delphi 随机函数的利用random 取10个介于1000与2000之间的随机数,并计算它们的最大,最小值及总和
- C++中求各种数据类型最大最小值问题
- 利用分治法求一组数据中最大的两个数和最小的两个数
- 判断某种特定类型可以容纳的最大值或最小值
- C/C++中各种数据类型 如 int ,char long,double 的范围(最大值和最小值)
- 编程计算int类型整数的最大值和最小值
- 数据类型:整数最小值为何不是最大值的相反数(为什么八位二进制数表示范围是:-128~127 ) ?
- 求任意数据类型(注意任意)数组的最大值和最小值
- Java 基本数据类型最大值极限和最小值极限
- java中数据类型间的最大值,最小值及转换程序代码实现
- 利用函数重载分别创建三个函数,分别是计算2个数的和,3个数的和,4个数的和/利用函数重载分别创建三个函数,分别计算int类型数组中最大值,stirng 类型数组中最长的字符串,double类型数组中最
- 利用excel的数据透视快速分析数据(求每项的最大值、最小值、求和)