如何在C中反转一段位数字?

如何在C中反转一段位数字?,c,bit-manipulation,C,Bit Manipulation,简言之,如果我处理的是二进制数字,比如0000 0110,假设我只想反转最后3位,有没有方法将其转换为0000 0011 我还看到了其他问题和参考资料,其中实现了反向位方法,但返回了反向的整数(即01100000,而不是0000 0011) 仅仅像标准方法中所做的那样将其反转,然后尽可能多地改变它就足够了吗?还是有更直接的方法来实现这一点 格式:unsigned int reverse\u select\u bits(int number,int num\u bits){…}由于只需反转三位,所

简言之,如果我处理的是二进制数字,比如
0000 0110
,假设我只想反转最后3位,有没有方法将其转换为
0000 0011

我还看到了其他问题和参考资料,其中实现了
反向位方法
,但返回了反向的整数(即
01100000
,而不是
0000 0011

仅仅像标准方法中所做的那样将其反转,然后尽可能多地改变它就足够了吗?还是有更直接的方法来实现这一点


格式:
unsigned int reverse\u select\u bits(int number,int num\u bits){…}

由于只需反转三位,所以准备一个包含八个条目的表是最简单的方法

int rev_table[8] = {0, 4, 2, 6, 1, 5, 3, 7};
int rev_last_three_bits(int v) {
    return (v & (~7)) | rev_table[v&7];
}

实现了一个函数,可以交换字符中的两个特定位

借助此函数,您可以反转位的任何部分

#include<stdio.h>
void swap_bits(char *a,unsigned char p1,unsigned char p2)
{
    if (p1==p2) return;//don't need swap
    unsigned char bit1=(1<<p1)&(*a);//access the bit in position 1(0-indexed);
    unsigned char bit2=(1<<p2)&(*a);//access the bit in position 2(0-indexed);
    (*a)^=bit1;//set the bit in position 1 to 0.
    if (bit2) (*a)^=1<<p1;// if bit2 is 1 then set the bit in position to 1 
    (*a)^=bit2;
    if (bit1) (*a)^=1<<p2;
}
int main()
{
    char a=0x06;
    swap_bits(&a,0,2);
    printf("%x\n",a);
}
#包括
无效交换_位(字符*a、无符号字符p1、无符号字符p2)
{
if(p1==p2)返回;//不需要交换
无符号字符位1=(1简单引用
See是一个很好的开始,让你了解到底应该如何做。这里介绍了一些非常有趣的技巧。特别是

了解如何思考这些问题

暗示 对于任意字长,请在使用掩码屏蔽要保存的位后使用明显的方法:

typeof(word) preserve_mask = \
     ((1 <<  8*sizeof(word)) - 1) & ~(typeof(word))((1 << K) - 1);
typeof(word)preserve\u mask=\

((1对不起,我不清楚……我举了3为例,在这种情况下,我希望这个数字是任意的。我会编辑这篇文章。哦,那样的话……我们需要一个更复杂的解决方案。我喜欢这个想法,但它似乎太贵了……我正在处理时间紧迫的计算,而且这个方法似乎重叠了太多重复的调用。我认为这但是可以进行优化以防止这种情况发生;我现在想不出一种方法。通过使用掩码和XO,可以更快地交换位。您只想反转最后的N位,还是想反转N位从位位置a到B?需要反转的位数是否有上限(比如8位)还是限制在<代码> int <代码>的大小?对于我的目的,我只需要最后的<代码> n>代码>位。在位序列中间的一个任意部分的反转是(我想)Okkyal.酷。基本上可以展开所有循环^^