求一个整数的二进制最高位

部署运行你感兴趣的模型镜像

求十进制整数的最高位非常简单,那计算机如何求一个整数的二进制最高位?

众所周知,计算是通过01二进制来表示世界的,自然整数也是使用二进制存储在计算机硬盘中。那如何求一个整数的二进制最高位的位置?

首先我们看看下面两个简单的例子,再来讲解如何求解的过程。
eg 1:
十进制整数表示: 8
二进制整数表示:1000

很明显的,由十进制整数8的二进制表示形式可知,十进制整数8的二进制最高位是第4位。

eg 2:
十进制整数表示: -8
二进制整数表示:11111111 11111111 11111111 11111000 (补码)

显而易见,一个负整数的二进制最高位不容易看出来。我们需要将补码转换成原码的形式,这样容易看出负整数的二进制最高位的位置。

二进制整数表示:10000000 00000000 00000000 00001000 (原码)

现在是不是很容易就能看出最高位的位置?负整数-8的二进制最高位的位置是第4位。

求解算法:
(1)对所求整数求绝对值;
(2)将步骤(1)的结果转换成二进制表示形式;
(3)对二进制整数从最低位向最高位方向遍历,并判断最高位的位置。

关键点是如何将一个整数转换成二进制数?或许您会使用栈或数组来实现,但这不是本文的初衷。本文将采用另外一种更为简单的方法--位运算和掩码来实现上述的求解算法。

源码:
/*
* get_bit_pos.c
*
*  Created on: 2010-3-24
*      Author: Mutse Young
*/
#include <stdio.h>
#include <stdlib.h>

#define MASK 01  /* 掩码 */

int get_bit_high_pos(int n);

int main() {
int num = 0;

printf("please input an integer:/n");
scanf("%d", &num);

printf("the high pos of the integer %d is %d./n", num, get_bit_high_pos(num));
return 0;
}

int get_bit_high_pos(int n) {
unsigned int num = abs(n); /* 取绝对值 */
int i = 0, pos = 0;

    for (i = 0; i <= 8 * sizeof(int); i++, num >>= 1) { /* 遍历二进制,求解最高位的位置 */
if ((num & MASK) == MASK) {
pos = i + 1;
}
}


return pos;
}

您可能感兴趣的与本文相关的镜像

Stable-Diffusion-3.5

Stable-Diffusion-3.5

图片生成
Stable-Diffusion

Stable Diffusion 3.5 (SD 3.5) 是由 Stability AI 推出的新一代文本到图像生成模型,相比 3.0 版本,它提升了图像质量、运行速度和硬件效率

以下是几种使用 C 语言判断一个整数二进制中 1 的个数的方法: ### 方法一:逐位右移并与 1 进行按位与运算 ```c #include <stdio.h> int main() { int i, x; int count = 0; scanf("%d", &x); for (i = 0; i < 32; i++) { if (((x >> i) & 1) == 1) count++; } printf("%d\n", count); return 0; } ``` 该方法通过循环 32 次(假设整数为 32 位),每次将整数右移 `i` 位,然后与 1 进行按位与运算,如果结果为 1,则说明该位为 1,计数器 `count` 加 1 [^1]。 ### 方法二:逐位左移并判断最高位 ```c #include <stdio.h> unsigned char func(unsigned char para) { int i = 0, num = 0; for (; i < 8; i++) { if (para & 0x80) num++; para <<= 1; } return num; } int main(void) { unsigned char input = 0; printf("请输入小于等于 255 的值:\n"); scanf("%d", &input); printf("输入数据的二进制数中 1 的位数为:%d", func(input)); return 0; } ``` 此方法针对无符号字符型(8 位),通过循环 8 次,每次判断最高位是否为 1,如果是则计数器 `num` 加 1,然后将变量左移一位 [^2]。 ### 方法三:按位左移 1 并与原数按位与 ```c #include <stdio.h> int main() { int n, count; int k = 1; printf("请输入一个十进制数:\n"); scanf("%d", &n); count = 0; while (k) { if (n & k) count++; k <<= 1; } printf("该二进制中含有%d个 1", count); return 0; } ``` 该方法将 1 不断左移,每次与原数进行按位与运算,如果结果不为 0,则说明该位为 1,计数器 `count` 加 1 [^3]。 ### 方法四:使用 `x & (x - 1)` 消除最低位的 1 ```c #include <stdio.h> #include <string.h> #include <stdlib.h> int func(int x) { int n = 0; while (x) { n++; x = x & (x - 1); } return n; } int main(int argc, char **argv) { if (2 != argc) { printf("Param Num Not Two ! \n"); return -1; } int param; param = atoi(argv[1]); int ret; ret = func(param); printf("ret :%d \n", ret); return 0; } ``` 该方法通过 `x & (x - 1)` 操作消除 `x` 二进制表示中最低位的 1,每消除一次,计数器 `n` 加 1,直到 `x` 为 0 [^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值