C语言_常见位操作

C语言_常见位操作


一、位操作函数

设置某位为1或者对某位清0、获取某位的值、对某位取反

/*对某位置1*/
unsigned Setbit(unsigned x,int n)
{
	return  x |= 1 << n;
}

/*对某位清0*/
unsigned Resetbit(unsigned x,int n)
{
	return  x &= ~(1 << n);
}

/*取某位的值*/
unsigned Getbit(unsigned x,int n)
{
	return  ((x) >> (n)&1))
}

/*对某位取反*/
unsigned Invertbit(unsigned x,int n)
{
	return   ((x) ^= 1<<(n))
}

获取x从p位到n位的值

unsigned Getbits(unsigned x,int p,int n)
{
	return (x >> (p+1-n)) & ~(~0 << n);
}

设置x从p位到n位的值

unsigned Setbits(unsigned x,int p,int n,int y)
{
     return x & ~(~(~0 << n) << (p+1-n)) | (y & ~(~0 << n)) << (p+1-n);
}

对x从p位到n位的值进行取反

unsigned Invertbits(unsigned x,int p,int n)
{
    return x ^ (~(~0 << n)) << (p-n+1);
}

对x循环右移n位

unsigned Rightbits(unsigned x,int n)
{
     return (x >> n) | (x << (8*(sizeof(unsigned))-n));
}

二、代码示例

代码如下(示例):

#include<stdio.h>
#include<string.h>


void print_binary(unsigned int num) {
    if (num > 1) {
        print_binary(num >> 1);
    }
    putchar((num & 1) ? '1' : '0');
 
}

/*对某位置1*/
unsigned Setbit(unsigned x,int n)
{
	return  x |= 1 << n;
}

/*对某位清0*/
unsigned Resetbit(unsigned x,int n)
{
	return  x &= ~(1 << n);
}

/*取某位的值*/
unsigned Getbit(unsigned x,int n)
{
	return  ((x) >> (n)&1);
}

/*对某位取反*/
unsigned Invertbit(unsigned x,int n)
{
	return   ((x) ^= 1<<(n));
}

unsigned Getbits(unsigned x,int p,int n)
{
	return (x >> (p+1-n)) & ~(~0 << n);
}


unsigned Setbits(unsigned x,int p,int n,int y)
{
     return x & ~(~(~0 << n) << (p+1-n)) | (y & ~(~0 << n)) << (p+1-n);
}

unsigned Invertbits(unsigned x,int p,int n)
{
    return x ^ (~(~0 << n)) << (p-n+1);
}

unsigned Rightbits(unsigned x,int n)
{
     return (x >> n) | (x << (8*(sizeof(unsigned))-n));
}


void main(int argc,char* argv[])
{
     int a= 178 ,b= 178 , c= 178 , d= 178 , e= 178 , f= 178 , g= 178 , h = 178;  
     int p = 5,n = 3;

     printf(" 178: \t\t\t");
     print_binary(a);
     printf("\t\n\n");

     printf(" Setbit(a,3): \t\t");
     print_binary(Setbit(a,3));
     printf("\t\n");

     printf(" Resetbit(b,4): \t");
     print_binary(Resetbit(b,4));
     printf("\t\n");

     printf(" Getbit(c,5):\t\t");
     print_binary(Getbit(c,5));
     printf("\t\n");


     printf(" Invertbit(d,2):\t");
     print_binary(Invertbit(d,2));
     printf("\t\n");

     printf(" Getbits(e,5,3):\t");
     print_binary(Getbits(e,5,3));
     printf("\t\n");


     printf(" Setbits(f,p,n,15):\t");
     print_binary(Setbits(f,p,n,15));
     printf("\t\n");

     printf(" Invertbits(g,5,3):\t");
     print_binary(Invertbits(g,5,3));
     printf("\t\n");

     printf(" Rightbits(h,5):\t");
     print_binary(Rightbits(h,5));
     printf("\t\n");

}

结果:
178:        10110010
Setbit(a,3):     10111010
Resetbit(b,4):    10100010
Getbit(c,5):     1
Invertbit(d,2):    10110110
Getbits(e,5,3):   110
Setbits(f,p,n,15):  10111010
Invertbits(g,5,3):  10001010
Rightbits(h,5):   10010000000000000000000000000101


  • 12
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值