C语言日记 2024年11月2日
目录
总结:
内容:
总结:
右移:>>
用例如下:
#include <stdio.h>
int main()
{
int n=8;
printf("n=%d\n",n);
n=n>>1;
printf("n=%d\n",n);
n=n>>1;
printf("n=%d\n",n);
n=n>>1;
printf("n=%d\n",n);
n=n>>1;
printf("n=%d\n",n);
return 0;
}
简单来说就是将你的这个数的二进制形式全体向右移。(向右移的内容并不会从左边冒出来。)
内容:
这道题比较简单,我的大体思路也都写在注释里了。
3226. 使两个整数相等的位更改次数
简单
给你两个正整数 n 和 k。
你可以选择 n 的 二进制表示 中任意一个值为 1 的位,并将其改为 0。
返回使得 n 等于 k 所需要的更改次数。如果无法实现,返回 -1。
示例 1:
输入: n = 13, k = 4
输出: 2
解释:
最初,n 和 k 的二进制表示分别为 n = (1101)2 和 k = (0100)2,
我们可以改变 n 的第一位和第四位。结果整数为 n = (0100)2 = k。
示例 2:
输入: n = 21, k = 21
输出: 0
解释:
n 和 k 已经相等,因此不需要更改。
示例 3:
输入: n = 14, k = 13
输出: -1
解释:
无法使 n 等于 k。
提示:
1 <= n, k <= 106
我的代码是这样的。
int minChanges(int n, int k) {
//如果一开始,n的二进制表示中的1不能覆盖k的1,那就返回-1.如果能覆盖,那么将两个二进制数组比较。
//最后得出更改需要的次数。
//用整形存这个二进制数是不行的,会溢出,我也想过用字符串存,但是太麻烦,最后发现根本不用存这个二进制。
int num=0;
if(n==k)
{
num=0;
}
else
{
int t1;
int t2;
while(n)
{
t1=n%2;
t2=k%2;
n=n/2;
k=k/2;
if(t1>t2)
{
num++;
continue;
}
else
{
if(t1==t2)
{
continue;
}
else
{
num=-1;
break;
}
}
}
}
if(k>n)
{
num=-1;
}
return num;
}
它的标准答案和我思路相似,但是我的更麻烦。
int minChanges(int n, int k) {
int res = 0;
while (n > 0 || k > 0) {
if ((n & 1) == 0 && (k & 1) == 1) {
return -1;
}
if ((n & 1) == 1 && (k & 1) == 0) {
res++;
}
n >>= 1;
k >>= 1;
}
return res;
}
作者:力扣官方题解
链接:https://leetcode.cn/problems/number-of-bit-changes-to-make-two-integers-equal/solutions/2969568/shi-liang-ge-zheng-shu-xiang-deng-de-wei-bzfv/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
它还有一个答案用到了__builtin_popcount()这个函数,写的更简洁,但是就不太好懂了,我就不放在这里了。
这个函数能返回你的数字的二进制形式里边1的个数。