判断整数的正负零特性

原为某软件公司试题,大意如下:对于给定的有符号32位整数,写一个函数,当该数为正数时返回1,为负数时返回-1,为零时返回零,要求不能使用任何的条件判断分支跳转语句。在这里,稍微扩展了一下,给出了对应无符号32位整数的情形。解决思路是符号位和值分开处理,对于有符号32位整数,符号位右移31位即得a,若为非负数则a=0x00000000,否则a=0xFFFFFFFF;然后将值部分各位的值(0或1不断缩小合并到一位中去得到b,这是针对0和正数的情况处理,再将a和b位即可。C++代码描述如下:

1//若val为0则返回0, val为负数则返回-1, 为正数返回1
2int32_t check32(int32_t val)
3ExpandedBlockStart.gifContractedBlock.gif
{
4    int32_t a = val
>> 31;
5    int32_t b = (val
& 0x0000FFFF) | ((val >> 16)&0x0000FFFF);
6    b = (b
& 0x000000FF) | ((b >> 8)&0x000000FF);
7    b = (b
& 0x0000000F) | ((b >> 4)&0x0000000F);
8    b = (b
& 0x00000003) | ((b >> 2)&0x00000003);
9    b = (b
& 0x00000001) | ((b >> 1)&0x00000001);
10   return a|b;
11}

12
13
//若val为0则返回0, 否则返回1
14uint32_t check32(uint32_t val)
15ExpandedBlockStart.gifContractedBlock.gif{
16    uint32_t a = (val & 0x0000FFFF) | ((val >> 16)&0x0000FFFF);
17    a = (a & 0x000000FF) | ((a >> 8)&0x000000FF);
18    a = (a & 0x0000000F) | ((a >> 4)&0x0000000F);
19    a = (a & 0x00000003) | ((a >> 2)&0x00000003);
20    a = (a & 0x00000001) | ((a >> 1)&0x00000001);
21    return a;
22}

最简单的方法是

return (val >> 31) | -(-val >> 31);

转载于:https://www.cnblogs.com/fengye87626/archive/2013/03/18/2965883.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 可以使用switch语句来验证一个数的正负。具体实现如下: ``` #include <stdio.h> int main() { int num; printf("请输入一个数:"); scanf("%d", &num); switch (num > 0) { case 1: printf("%d是正数", num); break; case 0: switch (num < 0) { case 1: printf("%d是负数", num); break; case 0: printf("%d是", num); break; } break; } return 0; } ``` 上面的代码中,首先从用户输入中获取一个整数,然后使用switch语句来判断这个数的正负。当数大于时,输出它是正数,当数小于时,输出它是负数,当数等于时,输出它是。 ### 回答2: switch语句在验证数的正负方面不是最常用的方法,一般使用if-else语句更为常见和简便。但如果非要使用switch语句,可以按照以下方式进行验证: 首先,假设要验证的数为num。 1. 使用switch语句对num进行判断。 2. 在switch语句的条件中,使用num的正负区间作为case的条件。 3. 如果num大于0,则设定case为大于0的情况,可以在该情况下打印出"正数"。 4. 如果num小于0,则设定case为小于0的情况,可以在该情况下打印出"负数"。 5. 如果num等于0,则设定case为等于0的情况,可以在该情况下打印出""。 6. 如果num不满足以上条件,可以将default的情况设定为无法判断的情况,可以在该情况下打印出"未知"。 以下为示例代码: ```java int num = -5; switch (true) { case num > 0: System.out.println("正数"); break; case num < 0: System.out.println("负数"); break; case num == 0: System.out.println(""); break; default: System.out.println("未知"); } ``` 需要注意的是,由于switch语句的特性,必须使用布尔类型的表达式作为switch后的条件,因此使用了num>0作为条件。同时,在每个case后面必须使用break语句来结束该情况的执行,以避免出现"case穿透"的情况。 ### 回答3: 可以使用switch语句来验证一个数的正负。具体步骤如下: 1. 首先,需要一个整数变量来存储要验证的数。 2. 使用switch语句,对于要验证的数,我们可以使用其符号(正号或负号)作为switch表达式。 3. 在switch语句中,设置两个case分支,分别匹配正数和负数的情况。 4. 在正数的case分支中,输出验证的数为正数的信息。 5. 在负数的case分支中,输出验证的数为负数的信息。 6. 当验证的数为0时,可以选择在default分支中处理,输出验证的数为的信息。 以下是一个示例代码: ```java public class VerifyPositiveNegative { public static void main(String[] args) { int number = -5; switch (Math.signum(number)) { case 1: System.out.println("验证的数为正数。"); break; case -1: System.out.println("验证的数为负数。"); break; default: System.out.println("验证的数为。"); } } } ``` 以上示例中,我们将一个负数(-5)作为要验证的数,利用Math.signum()方法得到数的符号,并通过switch语句进行验证。输出结果为:"验证的数为负数。"

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值