2、使用按位与运算,对8位数字的指定某个位去挖掉对应位上的1的操作;
包括:0-7的分支。
3、请思考:判断、挖掉和塞入1
如何为一个数字的第n位设置1?|(OR)
如何为一个数字的第n位设置0?&(AND) 和按位取反~(NOT)
如何判断一个数字的第n位是1还是0?&(AND)
#include <stdio.h>
void pri_binary(unsigned int inp)
{
//int bit = 0;
//while (bit < 32)
//{
// printf("%d",inp << bit >> 31);
// bit++;
// if (bit % 4 == 0)
// {
// putchar(32);
// }
//}
int bit = 32;
while (bit--)
{//31 .. 0
printf("%d", inp >> bit & 1);//& 1保留 0擦除1
if (bit % 4 == 0)
{
putchar(32);
}
}
}
void rever_1_to_0(unsigned char inp)
{
unsigned int bit = 0;
printf("请输入你想挖掉对应位上1的位数,位数范围为0-7:");
scanf_s("%d", &bit);
printf("替换前的二进制数:");
pri_binary(inp);
putchar(10);
//|操作,0保留,1擦除0
inp = inp & (~(1 << bit));
printf("替换后的二进制数:");
pri_binary(inp);
}
void jud_rep_insert_1(unsigned int inp)
{
while (1)
{
puts("1、在某个位置插入1:");
puts("2、在某个位置去除1:");
puts("3、判断某个位置是不是1:");
puts("0、退出:");
int x = 0;
int num = 0;
scanf_s("%d", &num);
if (!num)
break;
switch (num)
{
case 1:
{
printf("插入前的二进制数:");
pri_binary(inp);
putchar(10);
printf("请输入你想在第几位插入1,位数范围为0-7:");
scanf_s("%d", &x);
//&操作 1保留 0擦除1 或操作 0保留 1擦除0
inp = inp | 1 << x;
printf("插入后的二进制数:");
pri_binary(inp);
putchar(10);
break;
}
case 2:
{
printf("去除1前的二进制数:");
pri_binary(inp);
putchar(10);
printf("请输入你想在第几位去除1,位数范围为0-7:");
scanf_s("%d", &x);
//&操作 1保留 0擦除1 或操作 0保留 1擦除0
inp = inp & ~(1 << x);
printf("去除1后的二进制数:");
pri_binary(inp);
putchar(10);
break;
}
case 3:
{
printf("判断的二进制数:");
pri_binary(inp);
putchar(10);
printf("判断某个位置是不是1,位数范围为0-7:");
scanf_s("%d", &x);
//&操作 1保留 0擦除1 或操作 0保留 1擦除0
if ((inp & 1 << x) == (1 << x))
{
printf("第%d个位置是1", x);
putchar(10);
break;
}
printf("第%d个位置是0", x);
putchar(10);
break;
}
default:;
}
}
}
int main()
{
/*2、使用按位与运算,对8位数字的指定某个位去挖掉对应位上的1的操作;
包括:0 - 7的分支。
3、请思考:判断、挖掉和塞入1
如何为一个数字的第n位设置1? | (OR)
如何为一个数字的第n位设置0? & (AND)和按位取反~(NOT)
如何判断一个数字的第n位是1还是0? & (AND)*/
//rever_1_to_0(0xff);
jud_rep_insert_1(0xaf);
return 0;
}
![](https://i-blog.csdnimg.cn/blog_migrate/e928a06ceab6445483c36f023d05c4f4.png)
位运算的三大算法:
a)探测某x位是不是1:inp& 1<<x 与因子相等或者不等于0 inp | 1 << x 与inp相等
b)某x位添加1:n | 1<<x
c)挖掉某个位是1:n &= ~(1 << x); //0x0F去与某个数按位与,1代表保留,0代表擦除对方的1