c语言32比特7位有效,C语言中的位操作(14)--反转比特位

本篇文章主要讲述几种反转比特位的方法:

将一个32位数:abcd efgh 转置为hgfe dcba

1、常规方法

unsigned int v; // 目标待转置数

unsigned int r = v; //r保存反转后的结果,开始获取v的最低有效位

int s = sizeof(v) * CHAR_BIT - ; // 剩余需要移位的比特位

for (v >>= ; v; v >>= )

{

r <<= ;

r |= v & ;

s--;

}

r <<= s; // 当v的最高位为0的时候进行移位

原理:

通过循环对v进行逻辑右移,每右移一位,通过v & 1取v的最低位,加到r的最低位,r左移

最后对v的最高位进行判断,若原来v的最高位为0,则此时s=1,则再将v左移一位,若v的最高位为1,则s=0,则不进行任何操作。

2、查表

static const unsigned char BitReverseTable256[] =

{

# define R2(n) n, n + *, n + *, n + *

# define R4(n) R2(n), R2(n + *), R2(n + *), R2(n + *)

# define R6(n) R4(n), R4(n + * ), R4(n + * ), R4(n + * )

R6(), R6(), R6(), R6()

};

unsigned int v; // 反转32位数,每次8位

unsigned int c; //c保存结果

操作一:

c = (BitReverseTable256[v & 0xff] << ) |

(BitReverseTable256[(v >> ) & 0xff] << ) |

(BitReverseTable256[(v >> ) & 0xff] << ) |

(BitReverseTable256[(v >> ) & 0xff]);

原理:

通过嵌套宏定义构造一张表,BitReverseTable256[i]保存0~255进过反转后的值,再分别取v中的第1~8、9~16、17~24、25~32位的值通过查表得到相应的反转之后的值,在结合保存在r中

操作二:

unsigned char * p = (unsigned char *) &v;

unsigned char * q = (unsigned char *) &c;

q[] = BitReverseTable256[p[]];

q[] = BitReverseTable256[p[]];

q[] = BitReverseTable256[p[]];

q[] = BitReverseTable256[p[]];

原理较简单,和操作一类似,这里采用指针进行。

3、64位乘法与模除法

unsigned char b; // reverse this (8-bit) byte

b = (b * 0x0202020202ULL & 0x010884422010ULL) % ;

原理:

0x0202020202ULL: 0000 0010 0000 0010 0000 0010 0000 0010 0000 0010

0x010884422010ULL: 0000 0001 0000 1000 1000 0100 0100 0010 0010 0000 0001 0000

00000001 0000100010 0001000100 0010001000 0000010000

进行b * 0x0202020202ULL操作,变为: b0 b0 b0 b0 b0

乘法(*)操作产生将8位字节模式复制5份到64位的输出端

AND(&)操作选择正确位置(反转),相关联到每10位一组

乘法与“逻辑与”操作将源字中待反转的比特位与10位一组的比特位相一致

通过模除2^10-1,作用是结合64位数中的每10位组合(位置:0-9,10-19,20-29,……)

4、64位乘法(无除法)

unsigned char b; // 目标反转数

b = ((b * 0x80200802ULL) & 0x0884422110ULL) * 0x0101010101ULL >> ;

下面展示的bool变量a,b,c,d,e,f,g 和h,每一个由8位字节组成,注意第一个乘法是怎样通过乘法复制将位模式展开,而最后的乘法将它们从右边起每五字节一次地融合到一起

abcd efgh (-> hgfe dcba)

* (0x80200802)

-------------------------------------------------------------------------------------------------

0abc defg h00a bcde fgh0 0abc defg h00a bcde fgh0

& (0x0884422110)

-------------------------------------------------------------------------------------------------

d000 h000 0c00 0g00 00b0 00f0 000a 000e

* (0x0101010101)

-------------------------------------------------------------------------------------------------

d000 h000 0c00 0g00 00b0 00f0 000a 000e

d000 h000 0c00 0g00 00b0 00f0 000a 000e

d000 h000 0c00 0g00 00b0 00f0 000a 000e

d000 h000 0c00 0g00 00b0 00f0 000a 000e

d000 h000 0c00 0g00 00b0 00f0 000a 000e

-------------------------------------------------------------------------------------------------

d000 h000 dc00 hg00 dcb0 hgf0 dcba hgfe dcba hgfe 0cba 0gfe 00ba 00fe 000a 000e

>>

-------------------------------------------------------------------------------------------------

d000 h000 dc00 hg00 dcb0 hgf0 dcba hgfe dcba

&

-------------------------------------------------------------------------------------------------

hgfe dcba

5、采用7部操作(非64位)

b = ((b * 0x0802LU & 0x22110LU) | (b * 0x8020LU & 0x88440LU)) * 0x10101LU >> ;

abcd efgh

*

--------------------------------------------------------------------------------------------------------------

0abc defg h00a bcde fgh0

&

--------------------------------------------------------------------------------------------------------------

00b0 00f0 000a 000e

**************************************************************************************************************

abcd efgh

*

--------------------------------------------------------------------------------------------------------------

defg h00a bcde fgh0

&

--------------------------------------------------------------------------------------------------------------

d000 h000 0c00 0g00

**************************************************************************************************************

00b0 00f0 000a 000e

| d000 h000 0c00 0g00

--------------------------------------------------------------------------------------------------------------

d0b0 h0f0 0c0a 0g0e

*

--------------------------------------------------------------------------------------------------------------

d0b0 h0f0 0c0a 0g0e

d0b0 h0f0 0c0a 0g0e

d0b0 h0f0 0c0a 0g0e

--------------------------------------------------------------------------------------------------------------

d0b0 h0f0 dcba hgfe dcba hgfe 0c0a 0g0e

>>

--------------------------------------------------------------------------------------------------------------

d0b0 h0f0 dcba hgfe dcba

&

--------------------------------------------------------------------------------------------------------------

hgfe dcba

6、并行反转N位数时间复杂度(5 * lg(N))

unsigned int v; // 32位目标数字

// 交换奇偶位比特

v = ((v >> ) & 0x55555555) | ((v & 0x55555555) << );

// 交换连续数对

v = ((v >> ) & 0x33333333) | ((v & 0x33333333) << );

// 一点点的交换

v = ((v >> ) & 0x0F0F0F0F) | ((v & 0x0F0F0F0F) << );

// 交换字节

v = ((v >> ) & 0x00FF00FF) | ((v & 0x00FF00FF) << );

// 交换2字节长数对

v = ( v >> ) | ( v << );

下面展示的32位变量由ABCD EFGH IJKL MNPQ abcd efgh ijkl mnpq组成

/*((v >> 1) & 0x55555555) */

ABCD EFGH IJKL MNPQ abcd efgh ijkl mnpq

>>

--------------------------------------------------------------------------------------------------------------

0ABC DEFG HIJK LMNP Qabc defg hijk lmnp

&

--------------------------------------------------------------------------------------------------------------

0A0C 0E0G 0I0K 0M0P 0a0c 0e0g 0i0k 0m0p

**************************************************************************************************************

/*((v & 0x55555555) << 1)*/

ABCD EFGH IJKL MNPQ abcd efgh ijkl mnpq

&

--------------------------------------------------------------------------------------------------------------

0B0D 0F0H 0J0L 0N0Q 0b0d 0f0h 0j0l 0n0q

<<

--------------------------------------------------------------------------------------------------------------

B0D0 F0H0 J0L0 N0Q0 b0d0 f0h0 j0l0 n0q0

**************************************************************************************************************

/*v = ((v >> 1) & 0x55555555) | ((v & 0x55555555) << 1);*/

0A0C 0E0G 0I0K 0M0P 0a0c 0e0g 0i0k 0m0p | B0D0 F0H0 J0L0 N0Q0 b0d0 f0h0 j0l0 n0q0

--------------------------------------------------------------------------------------------------------------

BADC FEHG JILK NMQP badc fehg jilk nmqp

**************************************************************************************************************

/*((v >> 2) & 0x33333333)*/

BADC FEHG JILK NMQP badc fehg jilk nmqp

>>

--------------------------------------------------------------------------------------------------------------

00BA DCFE HGJI LKNM QPba dcfe hgji lknm

&

--------------------------------------------------------------------------------------------------------------

00BA 00FE 00JI 00NM 00ba 00fe 00ji 00nm

**************************************************************************************************************

/*((v & 0x33333333) << 2);*/

BADC FEHG JILK NMQP badc fehg jilk nmqp

&

--------------------------------------------------------------------------------------------------------------

00DC 00HG 00LK 00QP 00dc 00hg 00lk 00qp

<<

--------------------------------------------------------------------------------------------------------------

DC00 HG00 LK00 QP00 dc00 hg00 lk00 qp00

**************************************************************************************************************

/*((v >> 2) & 0x33333333) | ((v & 0x33333333) << 2);*/

00BA 00FE 00JI 00NM 00ba 00fe 00ji 00nm | DC00 HG00 LK00 QP00 dc00 hg00 lk00 qp00

--------------------------------------------------------------------------------------------------------------

DCBA HGFE LKJI QPNM dcba hgfe lkji qpnm

**************************************************************************************************************

/*((v >> 4) & 0x0F0F0F0F) */

DCBA HGFE LKJI QPNM dcba hgfe lkji qpnm

>>

--------------------------------------------------------------------------------------------------------------

DCBA HGFE LKJI QPNM dcba hgfe lkji

&

--------------------------------------------------------------------------------------------------------------

DCBA LKJI dcba lkji

**************************************************************************************************************

/*((v & 0x0F0F0F0F) << 4);*/

DCBA HGFE LKJI QPNM dcba hgfe lkji qpnm

&

--------------------------------------------------------------------------------------------------------------

HGFE QPNM hgfe qpnm

<<

--------------------------------------------------------------------------------------------------------------

HGFE QPNM hgfe qpnm

**************************************************************************************************************

/*((v >> 4) & 0x0F0F0F0F) | ((v & 0x0F0F0F0F) << 4);*/

DCBA LKJI dcba lkji

| HGFE QPNM hgfe qpnm

--------------------------------------------------------------------------------------------------------------

HGFE DCBA QPNM LKJI hgfe dcba qpnm lkji

**************************************************************************************************************

/*((v >> 8) & 0x00FF00FF */

HGFE DCBA QPNM LKJI hgfe dcba qpnm lkji

>>

--------------------------------------------------------------------------------------------------------------

HGFE DCBA QPNM LKJI hgfe dcba

&

--------------------------------------------------------------------------------------------------------------

HGFE DCBA hgfe dcba

**************************************************************************************************************

/*((v & 0x00FF00FF << 8);*/

HGFE DCBA QPNM LKJI hgfe dcba qpnm lkji

&

--------------------------------------------------------------------------------------------------------------

QPNM LKJI qpnm lkji

<<

--------------------------------------------------------------------------------------------------------------

QPNM LKJI qpnm lkji

**************************************************************************************************************

/*((v >> 8) & 0x00FF00FF) | ((v & 0x00FF00FF) << 8);*/

HGFE DCBA hgfe dcba

| QPNM LKJI qpnm lkji

--------------------------------------------------------------------------------------------------------------

QPNM LKJI HGFE DCBA qpnm lkji hgfe dcba

**************************************************************************************************************

/*v = ( v >> 16 ) | ( v << 16);*/

QPNM LKJI HGFE DCBA qpnm lkji hgfe dcba

>>

--------------------------------------------------------------------------------------------------------------

QPNM LKJI HGFE DCBA

QPNM LKJI HGFE DCBA qpnm lkji hgfe dcba

<<

--------------------------------------------------------------------------------------------------------------

qpnm lkji hgfe dcba

^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

QPNM LKJI HGFE DCBA

| qpnm lkji hgfe dcba

--------------------------------------------------------------------------------------------------------------

qpnm lkji hgfe dcba QPNM LKJI HGFE DCBA

下面的变版本时间复杂度也是O(lg(N)),但是需要更多的操作来反转V

unsigned int s = sizeof(v) * CHAR_BIT; // 数的位数; 必须为2的幂

unsigned int mask = ~;

while ((s >>= ) > )

{

mask ^= (mask << s);

v = ((v >> s) & mask) | ((v << s) & ~mask);

}

C语言中的位操作(16)--计算二进制数字尾部连续0的数目

本篇文章介绍计算二进制数字尾部连续0的数目的相关算法,例如:v=(1101000)2,该数尾部连续0的数目=3 方法1:线性时间算法 unsigned int v; // 需要计算的目标整数 int ...

C语言中的位操作(12)--判断一个数字是否包含一个全零字节

本文主要介绍一系列算法,算法主要功能是判断一个数字(二进制)中是否包含全零字节 e.g.1010 1111 0000 0000 1001 1111 0001 1111 即 32位整数:A4A3A2A1 ...

C语言中的位操作(15)--确定log10(N)的整数部分

本篇文章介绍一个整数的以10为底的对数的整数部分,即对于整数N,求log10(N)整数部分 方法一 : unsigned int v; //32位非0整数 int r; // r保存结果 int t; ...

C语言中的位域、字节序、比特序、大小端

转:http://www.360doc.com/content/13/0624/10/496343_295125641.shtml 1.比特序 / 位序 /  bit numbering / bit  ...

单片机的C语言中位操作用法2

单片机的C语言中位操作用法 在对单处机进行编程的过程中,对位的操作是经常遇到的.C51对位的操控能力是非常强大 的.从这一点上,就可以看出C不光具有高级语言的灵活性,又有低级语言贴近硬件的特点. 这也 ...

c语言中的位移位操作

先要了解一下C语言里所有的位运算都是指二进制数的位运算.即使输入的是十进制的数,在内存中也是存储为二进制形式. “<

单片机的C语言中位操作用法

在对单处机进行编程的过程中,对位的操作是经常遇到的.C51对位的操控能力是非常强大的.从这一点上,就可以看出C不光具有高级语言的灵活性,又有低级语言贴近硬件的特点.这也是在各个领域中都可以看到C的重要 ...

R语言学习笔记1——R语言中的基本对象

R语言,一种自由软件编程语言与操作环境,主要用于统计分析.绘图.数据挖掘.R本来是由来自新西兰奥克兰大学的Ross Ihaka和Robert Gentleman开发(也因此称为R),现在由“R开发核心 ...

c语言中会遇到的面试题

预处理器(Preprocessor) 1 . 用预处理指令#define 声明一个常数,用以表明1年中有多少秒(忽略闰年问题)         #define SECONDS_PER_YEAR (60 ...

随机推荐

基础笔记12(socket&comma;url网络通信)

进一步深入socket 1.网络通信条件: .IP地址,可用主机名. .传输数据时将不用的应用程序通过数字标识区分开来,这种标识称为逻辑端口,也称端口.(0-65535端口,一般系统预留0-1024) ...

css3新增属性API

写在前面:由于CSS5标准还未完全订下来,所以各种内核的浏览器都有自己的标准,为了不使属性混淆,所以各家在各自标准前加了一个前缀. -moz-  主要是firefox火狐 -webikt-主要是chr ...

Java从Jar文件中动态加载类

动态加载jar包,在实际开发中经常会需要用到,尤其涉及平台和业务的关系的时候,业务逻辑部分可以独立出去交给业务方管理,业务方只需要提供jar包,就能在平台上运行. 下面通过一个实例来直观演示: 第一: ...

Linux下设置静态IP和获取动态IP的方法

Linux下为机器设置静态IP地址: vim  /etc/sysconfig/network-scripts/ifcfg-eth0 修改这个文件内容如下形式: # Intel Corporation ...

tcp异常终止连接

服务端: #include #include #include #include & ...

python selenium phantomjs 报错

报错: webdriver.PhantomJS() raise exception_class(value)selenium.common.exceptions.WebDriverException: ...

版本控制-GitHub

前面几篇文章,我们介绍了Git的基本用法及Git服务器的搭建,本篇文章来学习一下如何使用GitHub.GitHub是开源的代码库以及版本控制库,是目前使用网络上使用最为广泛的服务,GitHub可以托管 ...

&lbrack;转帖&rsqb;Linux后端执行命令的方法

Linux 后台执行命令的方法 http://bbs.chinaunix.net/forum.php?mod=viewthread&tid=4241330&fromuid=212883 ...

R语言数据框小技巧

当我们想要把数据框的行或者列按照指定的顺序排列时,可以通过行名称或者列名称快速排列 data

pem转pfx

openssl req -new -key privkey.pem -out root.csr openssl x509 -req -days -sha1 -extensions v3_ca -sig ...

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值