Count 1 amount in a binary number, So GraceFul

本文介绍了一种优雅的方法来计算一个十进制数转换为二进制后的1的数量,并提供了一个对比函数用于验证算法的有效性。通过实例演示了如何使用该方法。
给你一个10进制的数将其变成2进制后会有多少个1 ?

/*
* i.e 很优雅(GraceFul)
* binary(hex) b = 10101100
* b - 1 = 10101011
* c = 1
* b=(b&(b - 1)) = 10101000
* b - 1 = 10100111
* c = 2
* b=(b&(b - 1)) = 10100000
* b - 1 = 10011111
* c = 3
* b=(b&(b - 1)) = 10000000
* b - 1 = 01111111
* c = 4
* b = 00000000
* break
*/
public int countOneGraceful(int hex) {
int c = 0;
for (; hex != 0; c ++)
hex &= hex - 1;

return c;
}

/*
* 用于与优雅对比的函数
*/
public int countOne(int hex) {
int c = 0;
for(; (hex/2) != 0; hex/=2)
if ((hex%2) == 1)
c ++;

if ((hex%2) == 1)
c ++;

return c;
}

/*
* 测试
*/
public static void main(String[] args) {
Fibonacci f = new Fibonacci(); //我的类

System.out.println("127 to binary: " + Integer.toBinaryString(127));
System.out.println(f.countOneGraceful(127));

System.out.println("128 to binary: " + Integer.toBinaryString(128));
System.out.println(f.countOneGraceful(128));
}
### 编写汇编程序以统计变量 `number1` 中二进制 0 的个数 以下是实现该功能的一个简单汇编程序示例。此程序假设目标平台为 x86 架构,并使用 NASM 汇编器进行编写。 #### 程序说明 为了完成任务,可以采用逐位检查的方法来统计变量中的二进制零的数量。具体方法如下: - 初始化计数器为 0。 - 对于每一位,判断其是否为 0。 - 如果当前位为 0,则增加计数器的值。 - 移动到下一位并重复操作直到处理完所有的位。 下面是完整的汇编代码: ```asm section .data number1 dd 1234 ; 定义变量 number1 并初始化为 1234 zero_count dd 0 ; 记录二进制 0 的数量 section .text global _start _start: mov ecx, 32 ; 设置循环次数为 32(因为是 32 位整数) mov eax, dword [number1] ; 将 number1 加载到 EAX 寄存器中 xor ebx, ebx ; 清除 EBX 寄存器用于存储计数值 count_zeros: shr eax, 1 ; 右移一位以便检查最低有效位 jnc skip_increment ; 如果未发生进位(即最低位为 0),跳过增量部分 inc ebx ; 否则增加计数器 skip_increment: loop count_zeros ; 循环执行直至 ECX 减至 0 store_result: mov dword [zero_count], ebx ; 存储最终的结果到内存位置 zero_count exit_program: mov eax, 1 ; 调用 sys_exit 系统调用号 xor ebx, ebx ; 返回状态码设置为 0 int 0x80 ; 执行中断退出程序 ``` #### 关键点解释 - **数据段定义**: 使用 `.data` 部分声明了一个名为 `number1` 的变量,并将其初始值设为十进制数 1234[^1]。 - **逻辑设计**: 利用了寄存器 `eax` 来保存被检测的数据,通过右移指令逐步提取每位的信息;利用条件分支语句决定何时更新计数器。 - **系统调用**: 在最后一步采用了 Linux 下的标准方式结束进程[^2]。 #### 测试与验证建议 可以通过修改输入值重新组装和链接这个简单的应用程序来进行测试不同的情况下的行为表现如何变化。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值