课后练习:
1、2*8的最高效的实现方式.
//2的二进制表示形式为 0010 16的二进制表示形式为 1111 通过左移4位可以实现 2*8
int main(void)
{
printf("%d",4 << 2);// 8 << 1
}
2、如何通过位运算判断一个数是奇数还是偶数?
//一个数如果是奇数的话,那么他的二进制最后一位一定为1. 跟1进行与运算 如果结果为0则为偶数 1则为奇数
//比如 8和1 1000 & 0001 -> 0000
// 7和1 0111 & 0001 ->0001
代码:
int main(void)
{
int i = 0;
int flag = 0;
scanf_s("%d",&i);
if(flag == (i & 1)){
printf("偶数");
}else
{
printf("奇数")
}
}
3、如何读取二进制数中的某一位的值?
/*比如说
8位二进制数A:
1000 1000
如果你想获A的哪一位,就把数字B:
0000 0000的那一为设置为1.
比如说,我想获得A的第三位
就把B的第三位数字设置为1,则B为
0000 0100,之后A、B求与,
结果若为0,说明A的第三位为0,结果为1,说明A的第三位为1.
同理:若要获得A的第五位,
就把B设置为
0001 0000.
之后再求与。
通常在程序中
数字B被称为掩码,就是专门用来测试某一位是否为0的数值.*/
#include <stdio.h>
int fun(int x, int n);
int main(void)
{
int k = fun(0,8);
printf("%d",k);
getchar();
return 0;
}
int fun(int x, int n)
{
//要取第n位值:(x>>(n-1))&1
return (x>>(n-1))&1;
}
4、如何设置二进制数中的某一位的值?
设置第n位值:
设置相反:x^(1<<n-1)
设置为1:x | (1<<n-1)
设置为0:对应位为0其余位为1
5.设 int a = 2; int b = 5; 使用位运算,交换两个变量的值,并打印。
int main(void)
{
a=a^b;
b=b^a;
a=a^b;
printf("%d %d",a, b);
}
6.使用位运算 获取 int 类型的最大值和最小值,并打印
int main(void)
{
printf("int最大值%p 最小值%p \n",(unsigned int)(~0),(unsigned int)(0));
}