给2个正整数A和B,把A变成B需要改变多少位(bit)

本文介绍了一个通过位运算来计算两个整数之间不同位数的C语言函数实现。该函数采用XOR操作符对比两个输入整数,并通过循环移位计算得到不同位数的总数。示例代码中使用了预定义的十六进制值进行演示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include <stdio.h>

int func(int A, int B)
{
	int M= A ^ B;
    int num=0;
	while(M!=0)
	{
		M &= (M-1);
		num++;
	}
	return num;
}

int main()
{
    int A, B;
    A=0x00;
	B=0x11;

	printf("%d\n", func(A,B));
    
	return 0;
}
 
#include<bits/stdc++.h> #define ll long long using namespace std; ll n, a, b; bool f(ll a, ll b) { string s1, s2; while (a) { s1.push_back(a % 2); a >>= 1; } while (b) { s2.push_back(b % 2); b >>= 1; } for (int i = 0; i < s1.size(); i++) if (s1[i] == 1 && s2[i] == 0) return false; return true; } int main() { ios::sync_with_stdio(0); cin.tie(0), cout.tie(0); cin >> n; while (n--) { cin >> a >> b; if (a == b)cout << 0 << '\n'; else if (a > b) cout << 2 << '\n'; else if (f(a, b))cout << 1 << '\n'; else cout << 2 << '\n'; } return 0; } /* 与:同1为1,否则为0 或:有1为1,否则为0 1:1 1==1 两相同则cnt=0 1:4 001 100 (1&0)|4=4 4:9 0100 1001 (4&0)|9=9 cout<<(3&0); 两不同最多&0加|m则cnt=2 4:5 100 101 4|5=5 4:7 100 111 4|3=7 两若n<m二进制有包含关系则cnt为1 (ll)2e5*18*2=7200000转二进制暴力判断会不超时 若n>m 4:3 100 011 不存在包含关系,直接输出2 */# P9496 「RiOI-2」hacker ## 题目背景 在小树丛边坐落着一个幻想的城堡。这里是 E 国的领地,而小 E,则是 E 国之王。 现在,伟大的 E 国之王正在披挂出征。 不过听说 E 国之王遇见了两个叫 ACCEPT BOTH 的人,他们是谁? ## 题目描述 现在有正整数 $n$,有以下操作; - 「ACCEPT」。花费 $1$ 的代价,将 $n$ [二进制](https://oi-wiki.org/math/base/#%E4%BA%8C%E8%BF%9B%E5%88%B6)**按或**上 一个正整数。 - 「BOTH」。花费 $1$ 的代价,将 $n$ [二进制](https://oi-wiki.org/math/base/#%E4%BA%8C%E8%BF%9B%E5%88%B6)**按与**上 一个正整数。 两种操作均可使用多次(或不用),请求出将 $n$ 变为 $m$ 最小的代价。 [帮助:什么是按或](https://oi-wiki.org/math/bit/#%E4%B8%8E%E6%88%96%E5%BC%82%E6%88%96) ## 输入格式 **本题有多组据。** 第一行一个正整数 $T$ 表示据组。 接下来 $T$ 行,每行两个正整数 $n, m$ 以空格隔开。 ## 输出格式 输出 $T$ 行,每行一个整数,表示答案。 ## 输入输出样例 #1 ### 输入 #1 ``` 3 1 1 4 5 1 4 ``` ### 输出 #1 ``` 0 1 2 ``` ## 说明/提示 ### 样例解释 + 对于 $n = 1$,$m = 1$,不需要任何操作。 + 对于 $n = 4$,$m = 5$,一种可行的方案为使用「ACCEPT $1$」。 + 对于 $n = 1$,$m = 4$,一种可行的方案为依次使用「ACCEPT $998{,}244{,}853$」「BOTH $14$」。 ### 据规模与约定 **本题开启捆绑测。** | $\text{Subtask}$ | 分值 | $T \leq$ | $n, m \leq$ | | :--------------: | :--: | :------: | :---------: | | $0$ | $30$ | $100$ | $100$ | | $1$ | $70$ | $2\times 10^5$ | $10^{18}$ | 对于所有据,$1\le T\le2\times 10^5$,$1\le n,m\le10^{18}$。 我的代码思路是否正确
最新发布
08-11
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值