大众点评如何做团购网站,威海百度网站建设,赣州网红打卡地,凡科的产品分类题目#xff1a; 输入#xff1a;整数A输出#xff1a;整数B条件#xff1a;A和B的二进制1的个数相同#xff0c;且A和B之间的距离|A-B|最小。思路#xff1a; 题目没有说明整数类型#xff0c;这里认为是带符号的整数#xff0c;即区分正负数。 根据题意#xff0c;A…题目 输入整数A 输出整数B 条件A和B的二进制1的个数相同且A和B之间的距离|A-B|最小。 思路 题目没有说明整数类型这里认为是带符号的整数即区分正负数。 根据题意A和B的二进制1的个数相同且要求距离最小那么A和B的差别就在于相邻的bit位如1100和10100011和0101等。 当A的最后一位低位为0则找到最后右边一位1然后将该1与左边的0交换即得到B如1100和1010 当A的最后一位低位为1则找到最后右边一位0然后将该0与右边的1交换即得到B。如0011和0101 注意 考虑边界条件计算机所有的数都是以补码的形式存在 二进制数全为0即0返回0二进制数全为1即-1返回-1正数除了符号位0其他均为1即该类型能表示的最大正整数将符号位0跟最低位右边的1交换结果为-2如127的二进制补码表示为0111 1111按上述规则交换之后为1111 1110补码转为原码负整数符号位不变取反1即1000 0010就是-2。 负数除了符号位1其他均为0即该类型能表示的最大负整数同样将符号位1跟最低位右边的0交换结果为1如-128的二进制补码表示为1000 0000按上述规则交换之后为0000 0001补码转为原码正整数补码和原码一样即0000 0001,就是1。 写代码时需注意 1、二进制补码的移位左移时正负数都是低位补0右移时正数高位补0负数高位补1 2、正负数的二进制补码表示以及相互转换 代码 #include iostream
#include math.husing namespace std;int sameSumOfOne(int a){if(a0)return 0;int b0;int pos0;int bit_numsizeof(int)*8;if((a1)0){while((a(1pos))0 (posbit_num))pos;//cout0_posposendl;if(posbit_num)return a;if(posbit_num-1)return 1;ba-(1pos)(1(pos-1));}else{while((a(1pos))(posbit_num))pos;//cout1_posposendl;// all bit is 1if(posbit_num)return a;if(posbit_num-1)return -2;ba-(1(pos-1))(1pos);}return b;
}int main()
{int maximum(int)((unsigned int)-1 1U);int minimum(int)~((unsigned int)-1 1U);int a[]{0,1,2,3,4,5,6,7,8,9,10,maximum,minimum,-1,-2};int nsizeof(a)/sizeof(a[0]);for(int i0;in;i)couta[i] sameSumOfOne(a[i])endl;coutendl;return 0;
} 运行结果 转载于:https://www.cnblogs.com/AndyJee/p/4579086.html