快速判断一个数是否是2的幂次

2的非零幂次数为:1,2,4,8,16, 32……

将其化为二进制  0001, 0010, 0100, 1000………… 可以观察到这样一个规律:二进制位数中有且仅有一位为1。则可以利用这

个规律进行快速判断。

如以16为例,其二进制为 1 0000,16-1=15,15的二进制为 0 1111, 可以将16和15进行相与运算,10000&01111 == 00000,即

16&15==0, 所以要快速判断一个数是不是2 的幂次,只要将这个数和其减一相与,如果结果为0,就是2的幂次,否则不是2的幂次。

#include <stdio.h>
int main()
{
    int value;
    scanf("%d", &value);
    if(!(value & value-1))
        printf("YES");
    else
        printf("NO");
    return 0;
}

 

<think>嗯,用户问的是如何用PHP判断一个年份是否是闰年。首先,我得回忆一下闰年的判断规则。闰年是为了调整日历与地球公转周期之间的差异而设定的,规则可能有些用户不太清楚,所以我需要先明确正确的判断条件。 首先,闰年的基本规则是能被4整除但不能被100整除,或者能被400整除的年份。比如2000年是闰年,因为它能被400整除,而1900年则不是,虽然能被4整除但也被100整除且不被400整除。所以这个逻辑需要准确无误地体现在代码中。 接下来,用户可能需要一个PHP函来实现这个判断。我需要考虑如何将上述规则转化为PHP代码。可能的步骤是:获取输入的年份,进行三个条件的检查:是否能被4整除、是否不能被100整除,或者是否能被400整除。如果这两个条件中有一个满足,就是闰年,否则不是。 然后,我需要考虑用户可能的输入方式。比如,用户可能通过表单提交一个年份,或者直接在命令行输入。这里可能需要验证输入是否为有效的年份,比如正整,但用户的问题可能更关注判断逻辑本身,所以可能暂时忽略输入验证,专注于核心算法。 另外,用户可能希望代码示例清晰易懂,所以应该使用函封装判断逻辑,并给出使用示例。例如,定义一个is_leap_year函,接受年份参,返回布尔值。同时,可以给出几个测试用例,比如2000年、2020年是闰年,1900年、2021年不是,以帮助用户理解。 还需要注意PHP中的运算符优先级,比如取余运算符%的使用,以及逻辑运算符&&和||的应用。确保条件表达式正确无误,避免因为优先级问题导致逻辑错误。比如,正确的条件应该是(能被4整除且不能被100整除)或者能被400整除,所以表达式应该是 ($year % 4 == 0 && $year % 100 != 0) || $year % 400 == 0。 此外,可能需要考虑年份的输入范围,比如是否支持0或负,但通常年份是正整,所以可以在代码中加入检查,但用户的问题可能没有提到这一点,所以可能暂时不做处理,或者简单提及输入验证的重要性。 还有,用户可能希望代码高效且简洁,所以避免不必要的计算,直接按照闰年规则编写条件。同时,考虑代码的可读性,使用清晰的变量名和注释,方便用户理解。 最后,可能需要对比其他编程语言中的实现方式,但PHP的实现逻辑与其他语言类似,所以可以保持代码的简洁性。总结下来,整个思考过程需要确保逻辑正确,代码示例清晰,并覆盖常见的测试用例,同时提醒用户注意可能的边界情况。</think>以下是用PHP判断闰年的详细实现方法: --- ### 一、闰年判断规则 满足以下任意条件即为闰年: 1. 能被4整除但不能被100整除(例:2020) 2. 能被400整除(例:2000) 不满足的为非闰年(例:1900, 2021) --- ### 二、PHP实现代码 #### 基础版函 ```php function is_leap_year($year) { return ($year % 4 == 0 && $year % 100 != 0) || ($year % 400 == 0); } // 使用示例 $test_year = 2024; echo $test_year . (is_leap_year($test_year) ? "是闰年" : "不是闰年"); ``` #### 增强版(带输入验证) ```php function check_leap_year($year) { if (!is_numeric($year) || $year < 1 || $year != floor($year)) { throw new InvalidArgumentException("请输入有效正整年份"); } return (($year % 4 == 0 && $year % 100 != 0) || $year % 400 == 0); } try { echo check_leap_year(2000) ? '闰年' : '平年'; // 输出:闰年 } catch (Exception $e) { echo $e->getMessage(); } ``` --- ### 三、关键代码解析 | 代码片段 | 作用说明 | |--------------------------|----------------------------| | `$year % 4 == 0` | 检查能否被4整除 | | `&& $year % 100 != 0` | 同时排除能被100整除的情况 | | `|| $year % 400 == 0` | 允许能被400整除的特殊情况 | --- ### 四、常见测试用例 ```php $test_cases = [ 2000 => true, // 能被400整除 2020 => true, // 能被4整除且不被100整除 1900 => false, // 能被100整除但不被400整除 2021 => false, // 不能被4整除 1600 => true, // 世纪闰年 2024 => true // 普通闰年 ]; foreach ($test_cases as $year => $expected) { $result = is_leap_year($year); echo "{$year}年:".($result === $expected ? "✔" : "❌")."\n"; } ``` --- ### 五、特殊场景处理 #### 1. 超大年份验证 ```php // 处理超过PHP整范围的年份(使用字符串转换) function big_year_check($year_str) { $year = (int)$year_str; if ((string)$year !== $year_str) { return "无效的年份格式"; } return is_leap_year($year); } echo big_year_check('100000000000000000000'); // 自动转为浮点前判断 ``` #### 2. 日期扩展验证 ```php // 使用DateTime类辅助验证 function is_leap_via_date($year) { $date = DateTime::createFromFormat('Y-m-d', $year.'-02-29'); return $date && $date->format('m-d') == '02-29'; } ``` --- ### 六、性能优化建议 1. **避免重复计算**:将`%`运算结果存入变量 ```php function optimized_leap($year) { $mod4 = $year % 4; $mod100 = $year % 100; return ($mod4 === 0 && $mod100 !== 0) || ($year % 400 === 0); } ``` 2. **位运算加速**(仅适用于2): ```php // 快速判断4的倍(仅当year是正时有效) ($year & 3) == 0 // 等价于 $year % 4 == 0 ``` --- ### 七、相关学原理 闰年计算公式可简化为: $$ \text{闰年} = \left( \left\lfloor \frac{year}{4} \right\rfloor - \left\lfloor \frac{year}{100} \right\rfloor + \left\lfloor \frac{year}{400} \right\rfloor \right) > 0 $$ --- ### 八、历史背景说明 该算法基于1582年颁布的格里高利历法,修正了儒略历每128年误差1天的缺陷。PHP的实现严格遵循现代国际标准历法规则。 --- 通过这个实现,可以准确处理从公元1年到超大年份的闰年判断,建议优先使用带输入验证的版本以确保程序健壮性。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值