n&(n-1) 的作用记录

二进制操作在编程中的应用
本文详细解释了在编程中如何使用位操作符n&(n-1)来实现特定的功能,包括计数二进制表示中1的个数、判断是否为2的幂次方,以及LeetCode题解等实例。

n&(n-1)作用:将n的二进制表示中的最低位为1的改为0。

应用:
1. 求某一个数的二进制表示中1的个数

while (n > 0 ) {
    count ++;
    n &= (n-1);
}

2 判断一个数是否是2的方幂

n > 0 && ((n & (n - 1)) == 0 )

Leetcode 231

public class Solution {
    public boolean isPowerOfTwo(int n) {
        int count = 0;
        while(n>0){
            count += n&1;
            n>>=1;
        }
        return count ==1;
    }

}

如 n&1 就是n变成二进制,然后和1作(&)与运算,同时有1则产生1

如 n&(n-1) 假如n=5 则5&4 ==》101 & 100 = 1

### 命令解释 #### `FIRMWARE=Tapo_C510Wv1_en_1.3.3_Build_250919_Rel.14398n_up_boot - signed` 此命令是在定义一个名为 `FIRMWARE` 的环境变量,将其值设定为 `Tapo_C510Wv1_en_1.3.3_Build_250919_Rel.14398n_up_boot - signed`。这个变量代表了要升级的固件文件名,后续命令会用到该变量。 #### `upgrade_prepare` 这是一个自定义的脚本或者命令,其作用可能是为固件升级做准备工作。例如,检查设备的状态、释放必要的资源、验证设备是否满足升级条件等。 #### `tftp -gr $FIRMWARE 192.168.137.1 -b20003` - `tftp` 是一个简单文件传输协议的客户端程序,用于在网络上进行文件传输。 - `-g` 表示从远程服务器下载文件。 - `-r` 后面跟着要下载的文件名,这里使用了之前定义的 `$FIRMWARE` 变量。 - `192.168.137.1` 是 TFTP 服务器的 IP 地址,固件文件存放在该服务器上。 - `-b20003` 可能是指定传输块的大小为 20003 字节,用于优化传输效率。 #### `nvrammanager -n -u $FIRMWARE` - `nvrammanager` 是一个用于管理非易失性随机访问存储器(NVRAM)的工具。 - `-n` 可能是一个选项,用于指定特定的操作模式或者配置。 - `-u` 表示进行升级操作,后面跟着要升级的固件文件名,即 `$FIRMWARE`。 ### 优化建议 #### 错误处理 在每个命令执行后,添加错误检查机制,确保命令执行成功后再继续执行后续命令。可以使用 `&&` 连接命令的同时,添加错误处理代码。 ```bash # 定义固件文件名 FIRMWARE=Tapo_C510Wv1_en_1.3.3_Build_250919_Rel.14398n_up_boot - signed # 执行升级准备命令,并检查是否成功 upgrade_prepare if [ $? -ne 0 ]; then echo "升级准备失败,请检查设备状态。" exit 1 fi # 从 TFTP 服务器下载固件,并检查是否成功 tftp -gr $FIRMWARE 192.168.137.1 -b20003 if [ $? -ne 0 ]; then echo "固件下载失败,请检查网络连接和 TFTP 服务器配置。" exit 1 fi # 执行 NVRAM 升级命令,并检查是否成功 nvrammanager -n -u $FIRMWARE if [ $? -ne 0 ]; then echo "NVRAM 升级失败,请检查固件文件和设备配置。" exit 1 fi echo "固件升级成功!" ``` #### 日志记录 在每个命令执行前后,添加日志记录,方便后续排查问题。 ```bash # 定义固件文件名 FIRMWARE=Tapo_C510Wv1_en_1.3.3_Build_250919_Rel.14398n_up_boot - signed # 记录升级准备开始时间 echo "$(date): 开始进行升级准备..." upgrade_prepare if [ $? -ne 0 ]; then echo "$(date): 升级准备失败,请检查设备状态。" exit 1 fi echo "$(date): 升级准备完成。" # 记录固件下载开始时间 echo "$(date): 开始从 TFTP 服务器下载固件..." tftp -gr $FIRMWARE 192.168.137.1 -b20003 if [ $? -ne 0 ]; then echo "$(date): 固件下载失败,请检查网络连接和 TFTP 服务器配置。" exit 1 fi echo "$(date): 固件下载完成。" # 记录 NVRAM 升级开始时间 echo "$(date): 开始进行 NVRAM 升级..." nvrammanager -n -u $FIRMWARE if [ $? -ne 0 ]; then echo "$(date): NVRAM 升级失败,请检查固件文件和设备配置。" exit 1 fi echo "$(date): NVRAM 升级完成。" echo "$(date): 固件升级成功!" ``` #### 配置参数化 将一些固定的参数(如 TFTP 服务器 IP 地址、传输块大小等)提取出来,作为变量,方便后续修改和维护。 ```bash # 定义固件文件名 FIRMWARE=Tapo_C510Wv1_en_1.3.3_Build_250919_Rel.14398n_up_boot - signed # 定义 TFTP 服务器 IP 地址和传输块大小 TFTP_SERVER=192.168.137.1 BLOCK_SIZE=20003 # 执行升级准备命令,并检查是否成功 upgrade_prepare if [ $? -ne 0 ]; then echo "升级准备失败,请检查设备状态。" exit 1 fi # 从 TFTP 服务器下载固件,并检查是否成功 tftp -gr $FIRMWARE $TFTP_SERVER -b$BLOCK_SIZE if [ $? -ne 0 ]; then echo "固件下载失败,请检查网络连接和 TFTP 服务器配置。" exit 1 fi # 执行 NVRAM 升级命令,并检查是否成功 nvrammanager -n -u $FIRMWARE if [ $? -ne 0 ]; then echo "NVRAM 升级失败,请检查固件文件和设备配置。" exit 1 fi echo "固件升级成功!" ``` ### 相关问题 1. Tapo_C510Wv1 固件升级失败后如何恢复设备? 2. 升级 Tapo_C510Wv1 固件时,TFTP 服务器需要做哪些配置? 3. PyTapo 库是否支持 Tapo_C510Wv1 固件升级操作? 4. 升级 Tapo_C510Wv1 固件时,是否需要备份设备的配置信息? 5. 除了 TFTP 方式,还有其他方式可以升级 Tapo_C510Wv1 固件吗?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值