求二进制数中高位或低位第一次出现1所在的位置

题目:

怎么求二进制数中,第一次出现1的位置(高位)?


解题思路:

解法一、用O(n)的时间判断,每次用&操作判断最高位是否为1,如果不是则左移一位,直到找到第一个1为止。

解法二、用二分法。依次判断是否在左边或者右边。时间复杂度为O(lgn).

注:上面的n为二进制数的位数,下面代码中是从0开始计数的。


代码:

/**
	 * O(n)的解法
	 * @param a
	 * @return
	 */
	public int clz1(Byte a){
		int n = 0;
		while((a & 0x80) == 0){
			a = (byte) (a << 1);
			n++;
		}
		return n;
	}

	/**
	 * 用二分法
	 * @param a
	 * @return
	 */
	public int clz2(Byte a){
		int n = 0;
		if((0xF0 & a) == 0){
			n += 4;
			a = (byte) (a << 4);
		}
		if((0xC0 & a) == 0){
			n += 2;
			a = (byte) (a << 2);
		}
		if((0x80 & a) == 0){
			n += 1;
		}
		return n;
	}


高位求出来了,那么低位呢?

当然可以用上面一样的方法求,除了上面的两种方法外,还有一个方法。

假设要求的数为a,那么令n=a-(a&(a-1)),然后lg(n)就是所求的结果。

### 回答1: 可以使用以下函数实现将十进制数转换为二进制数: ```python def decimal_to_binary(decimal): binary = '' while decimal > : binary = str(decimal % 2) + binary decimal //= 2 return binary ``` 该函数的实现思路是:不断地将十进制数除以2,将余数加到二进制数的最前面,直到十进制数为为止。最后返回得到的二进制数。 例如,将十进制数13转换为二进制数,可以调用该函数: ```python binary = decimal_to_binary(13) print(binary) # 输出:1101 ``` 该函数的输出结果为字符串类型的二进制数。如果需要将其转换为整数类型,可以使用以下代码: ```python binary_int = int(binary, 2) print(binary_int) # 输出:13 ``` 其中,int()函数的第二个参数指定了进制数,这里是2表示二进制。 ### 回答2: 在计算机中,数字一般采用二进制表示,因此在某些情况下需要将十进制数转换为二进制数。我们可以编写一个函数来实现这个转换过程。 首先,需要了解二进制数的表示方法。二进制数由0和1组成,每一上的数值表示该上的2的几次方。例如,二进制数1011表示: 1*2^3 + 0*2^2 + 1*2^1 + 1*2^0 = 11 转换过程可以采用除2取余法。具体步骤如下: 1. 将十进制数除以2,得到商和余数。余数为该数的最低位二进制数值。 2. 将商继续除以2,得到商和余数。余数为次低位二进制数值。 3. 重复以上过程,直到商为0。将余数按顺序排列,即可得到该数的二进制值。 下面是Python实现的代码: ```python def decimal_to_binary(num): binary = '' while num > 0: remainder = num % 2 binary = str(remainder) + binary num //= 2 return binary ``` 在该函数中,我们通过循环,反复进行除2取余的过程。每次取得余数后,将其添加到二进制字符串的最前面。最后,返回该字符串即可。 例如,我们要将十进制数25转换为二进制数,调用该函数如下: ```python decimal_to_binary(25) ``` 输出结果为:'11001' 这说明,25的二进制表示为11001。 综上所述,编写函数将十进制数转换为二进制数,可以通过除2取余的方法实现。对于更大的数字,该方法也同样适用,只需要不断地进行除2操作并记录余数即可。 ### 回答3: 将十进制数转换为二进制数是一个很基础的问题。在计算机中,二进制数是最常用的数值类型之一,因为在计算机内部所有的数据都是以二进制数的形式存储和处理的。因此,将十进制数转换为二进制数也是很重要的一项技能。 如果要编写函数来实现将十进制数转换为二进制数,需要先了解一些基本的数值运算规则和转换方法。具体来说,我们可以使用以下步骤来完成这个过程: 1. 将十进制数分解为二进制:首先,我们可以将十进制数按照从高到低的顺序,依次除以2,并把余数记录下来。一直重复这个过程,直到商为0,这样我们就得到了一个二进制序列。 2. 反转二进制序列:接下来,我们需要把刚才得到的二进制序列反转一下,因为它们是从低位高位排列的,而我们需要的是从高位低位的排列方式。 3. 连接二进制序列:最后,我们需要把反转后的二进制序列连接起来,得到一个完整的二进制数。 基于以上分析,我们可以编写出一个将十进制数转换为二进制数的函数代码。具体实现代码如下: ``` def decimal_to_binary(num): # 初始化变量 binary_list = [] quotient = num # 分解十进制数 while quotient != 0: remainder = quotient % 2 quotient = quotient // 2 binary_list.append(remainder) # 反转二进制序列 binary_list.reverse() # 连接二进制序列 binary_str = ''.join(str(i) for i in binary_list) # 返回结果 return binary_str ``` 这个函数接受一个十进制数作为输入,并返回一个字符串类型的二进制数。在函数内部,我们首先定义了一个列表和一个商变量来存储二进制和当前的商值。然后我们使用while循环来重复分解十进制数,并把余数添加到binary_list中。接下来,我们使用列表的reverse()方法来反转二进制序列,并用join()方法连接二进制序列。最后,我们返回二进制数字符串。 因此,在调用这个函数之后,我们可以得到输入十进制数的二进制表示。例如,输入decimal_to_binary(42),会返回结果'101010'。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值