Java得到一个整数的绝对值,不使用任何判断和比较语句,包括API.

/**
* Java得到一个整数的绝对值,不使用任何判断和比较语句,包括API. <br>
* 1、不得使用任何API,如Math.abs()等。<br>
* 2、不得使用判断语句,如if、for、while、switch、?:等。<br>
* 3、不得使用比较语句,如:==、 <=、>=、!=、 <、>等。 <br>
*
* @author JAVA世纪网(java2000.net, laozizhu.com)
*/
public class Test {
public static void main(String[] args) {
for (int i = -5; i <= 5; i++) {
System.out.println(abs(i));
}
}
public static int abs(int num) {
return num * (1 - ((num >>> 31)<<1));
}
}

================================

num>>>31 得到的是num的符号位。num为负则num>>>31=0;否则num>>>31=1;

(num>>>31) < <1 相当于将 num>>>31 乘以2.

1- ((num>>>31) < <1) 的作用是将 ((num>>>31) < <1)由0变为1,或者由1变为-1;

经过1- ((num>>>31) < <1) 的变换后,如果Num为负,则表达式的结果为-1;否则为1。

num* (1- ((num>>>31) < <1))的意思也就明确了……

时间: 2024-10-05 13:09:27

Java得到一个整数的绝对值,不使用任何判断和比较语句,包括API.的相关文章

Java 输入一个整数,计算它各位上数字的和。(注意:是任意位的整数)

import java.util.*; /* * 输入一个整数,计算它各位上数字的和. * (注意:是任意位的整数) */ public class Sum02 { public static void main(String[] args) { System.out.print("请输入任意一个整数:"); Scanner s = new Scanner(System.in); int sum = 0; int t = s.nextInt(); while(t!=0){ sum =

java输入一个整数N,打印1~n位数

举个栗子:输入 3 : 打印1,2,3......999 这里要注意一个坑,不可以直接算出最大的数,然后从1开始打印 .因为当n足够大时,n位数必定会超出int范围和long范围 所以我们需要用字符串来解题 , 模拟加法运算,循环打印. 思路: 1.先将n位数最大的一项+1用字符串str标记 2.StringBuilder对象ans用来做加法运算以及打印操作 3.boolean类型flag 用来标记是否需要进位 4.每次都从ans最后一位开始+1,需要进位时,将此时i的位置值为0,紧接着判断它的

Java 返回一个整数的各个数字之和的一种方法

public static long sumDigits(long n){ long total=0; long number=n; while(number!=0){ total=total+number%10; number=(number-number%10)/10; } return total; } public static void testSumDigits(){ System.out.println("Enter a long integer: "); Scanner

Java之一个整数的二进制中1的个数

这是今年某公司的面试题: 一般思路是:把整数n转换成二进制字符数组,然后一个一个数: private static int helper1(int i) { char[] chs = Integer.toBinaryString(i).toCharArray(); int res = 0; for (int j = 0; j < chs.length; j++) { if (chs[j] == '1') { res++; } } return res; } 第二种方法是:将整数n与1进行与运算,

输入一个整数,判断其是否是2^n,是就输出这个数,不是就输出和它最接近的为2^n的那个整数。

输入一个整数,判断其是否是2^n,若是,输出这 //个数,若不是,输出和它最接近的为2^n的那个整数. 附加源代码1: #include<stdio.h> #include<stdlib.h> #include<math.h> int main() { int input;//键盘输入一个整数input int i,j;//i,j待会儿存放input与左边和右边的为2^n的差值 int m,n;//保存左边,右边的与inout最接近的2^n printf("请

经典算法之判断一个整数是否为素数

经典算法之判断一个整数是否为素数 1 /** 2 判断一个数是否为素数 如: 3 输入: 任意一个数 12 4 输出: 1或0(1表示为素数) 0 5 */ 6 /**************被称为笨蛋的做法************/ 7 #include <stdio.h> 8 9 int main() 10 { 11 12 int i,n; //i为计数数,n为存储用户输入的数 13 14 do //循环检测用户输入的数据>0为合法 15 scanf("%d",&

软件工程结对开发——返回一个整数数组中最大子数组的和(JAVA)

题目:返回一个整数数组中最大子数组的和. 要求: 输入一个整型数组,数组里有正数也有负数: 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和: 求所有子数组的和的最大值.要求时间复杂度为O(n): 一.设计思想 1.首先随机产生一个数组,数组长度可自行输入,该数组里有正数也有负数. 2.从数组中第一个元素a[0]开始,依次计算a[0].a[0]+a[1].a[0]+a[1]+...+a[i]的值,即从a[0]开始的每个子数组的和,取出最大值. 3.再从数组第二个元素a[1]开始,依

java例题_32 取一个整数a从右端开始的4~7位

1 /*32 [程序 32 左移右移] 2 题目:取一个整数 a 从右端开始的 4-7 位. 3 */ 4 5 /*分析 6 * 从右端开始的第四位相当于原数除以1000后结果的最后一位数, 7 * 而4~7位就相当于再除以1000的结果下再对10000取余! 8 * 可以int也可以long类型 9 * */ 10 11 package homework; 12 13 import java.util.Scanner; 14 15 public class _32 { 16 17 public

【二】在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否函数该整数。 ```java public class Test { /** 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组

在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否函数该整数. public class Test { /** 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否函数该整数. */ public static void main(String[] args) { int[][] arr =