?本博客代码中使用的操作符运算,可以查看博主的这篇博客C语言操作符与表达式详解
(1)输出一个整数,输出该数32位二进制表示中1的个数,其中负数用补码表示。
//(1)输出一个整数,输出该数32位二进制表示中1的个数,其中负数用补码表示。
int NumberOf(int x) { //不同方法在第三题
int count = 0;
for (int i = 0; i < 32; i++) //整数32位
{
if (((x>>i) & 1) == 1) { //一个二进制数&1若等于1(...0001),说明其最后一位上为1,依次向右移位,统计1的数量
count++;
}
}
return count;
}
int main() {
int x;
scanf("%d", &x);
int ret = NumberOf(x);
printf("%d", ret);
}
(2)判断一个整数是否是2的n次方
?
//(2)判断一个整数是否是2的n次方
bool IsSquare(int n) {
if ((n&(n-1))==0) //2的n次方的数字二进制表示只有一个1,n&(n-1)若为1,表示该数字二进制中只有一个1
{
return true;
}
else
{
return false;
}
}
int main() {
int n;
scanf("%d", &n);
if (IsSquare(n) == true) {
printf("Y");
}
else
{
printf("N");
}
}
?(3)求两个数二进制中不同位的个数
//(3)求两个数二进制中不同位的个数
int NumberOf(int n) {
int count=0;
while (n) //当n中的1被消除完了,为0时退出循环
{
n = n & (n - 1); //n每与(n-1)进行一次&操作,就会消去一个1
count++;
}
return count;
}
int main() {
int x, y;
scanf("%d %d", &x, &y);
int ret = x^y; //异或操作,得到的结果x和y有几位不同就有几个1
int count = NumberOf(ret);//统计数中1的个数,与第一题采取不同的方法
printf("%d", count);
}
(4)获取一个整数二进制序列中所有的偶数位和奇数位,分别打印出二进制序列
?
//(4)获取一个整数二进制序列中所有的偶数位和奇数位,分别打印出二进制序列
int main() {
int x;
scanf("%d", &x);
//打印偶数位
for (int i = 31; i >= 1; i -= 2) {
printf("%d ",(x>>i)&1); //从高偶数位到低偶数位依次执行右移操作,与1执行&操作,结果为多少就是该偶数位的值
}
printf("\n");
//打印奇数位
for (int i = 30; i >= 0; i -= 2) {
printf("%d ", (x >> i) & 1); //从高奇数位到低奇数位依次执行右移操作,与1执行&操作,结果为多少就是该奇数位的值
}
}
(5)交换两个整型变量,不允许创建临时变量
?
//(5)交换两个整型变量,不允许创建临时变量
int main() {
int a, b;
scanf("%d %d", &a, &b);
a = a ^ b; //a异或b
b = a ^ b; //b=a^b^b, b^b=0,所以b=a
a = a ^ b; //a=a^b^a, a^a=0,所以a=b
printf("%d %d", a, b);
}