使用递归位运算实现对字节的中心转置反转

本文介绍了一道IBM技术面试题,要求实现字节的位中心翻转,即对称位数据交换。通过递归位运算,分别提供了C语言和VB.NET的解题代码实现,详细解析了算法思路和位操作过程。
摘要由CSDN通过智能技术生成
字节的中心转置反转,这是一道的IBM技术面试题,供参考

原题如下:

给定一个任意字节长度的数据(以一个Byte为例),要求实现数据的位中心翻转,

也就是数据的对称位数据交换,比如:

1010 1100 -> 0011 0101

1111 1111 -> 1111 1111

0000 0000 -> 0000 0000

1111 0000 -> 0000 1111

解题思路也很简单,只要使用位运算实现以下的位变化即可,但是需要考虑到其他

位的情况,注意运算符的使用即可,IBM不愧是IBM

11 - > 11

00 - > 00

10 - > 01

01 - > 10





以下是C语言和VB.net语言的两种解题实现的代码,VB涉及位转换,效率较低

,但是算法是一样的,同时,这里使用了递归算法



VB.net



'全局变量,保存需要转换的数据

Private val As Byte



'''

''' 核心算法,使用递归实现一个Byte的字节中心转置

'''

'''

'''

Private Sub fun(ByVal a As Byte)

If a = 0 Then

Exit Sub

End If

'11 - > 11

'00 - > 00

'10 - > 01

'01 - > 10

'算法在于排除11和00的情况,01和10反转

'排除and之后全是0的情况

If (val And a) <> (CByte(128 / a) And val) Then

'其中一个为0,另一个必为1 , 全1的情况自然排除

If (val And a) = 0 Or (CByte(128 / a) And val) = 0 Then

'进行位运算

val = CByte(val Xor (a + CByte(128 / a)))

End If

End If

'递归调用

fun(a / 2)

End Sub



C/C++



//C语言实现一个Byte的字节中心转置

#include

#include



#define BYTE 8

//#define INTEGER 16



#define LENGTH BYTE

//#define LENGTH INTEGER



//求出算子,用于参数传递

#define ARGUMENT pow(2 , (LENGTH / 2 - 1))

//#define ARGUMENT 1 << LENGTH - br>


#define HIGHT 0x80 /*1000 0000*/

//#define HIGHT 0x8000 /*1000 0000 0000 0000*/



unsigned short val = 0;

//unsigned int val = 0;



int fun(int a){

//a为空,返回

if (0 == a) {

return 0;

}

//'11 - > 11

//'00 - > 00

//'10 - > 01

//'01 - > 10

//'算法在于排除11和00的情况,01和10反转

//'排除and之后全是0的情况

if ( (val & a) != ((HIGHT / a) & val) ){

//其中一个为0,另一个必为1 , 全1的情况自然排除

if ( 0 == (val & a) || 0 == ((HIGHT / a) & val) ) {

//进行位运算

val = val ^ ((HIGHT / a) + a);

}

}

fun(a / 2);

//func(a >> 1);

return 1;

}



int main(int argc , char * args[]) {

//输入

scanf("%d", &val);

//递归调用

fun(ARGUMENT);

//输出

printf("%d", val);

return 0;

}



完整代码下载

http://www.lidaren.com/code/bytecvt/src.zip

VB运行效果

使用递归位运算实现对字节的中心转置反转 - 老道 - 我的博客
--------------------------------------------------------------------------------------
- 版权声明:
- 如在本页面内无特别说明,本文内容均为[李大仁博客]原创,本文版权归[李大仁博客]所有。
- 欢迎转载,转载请务必在文章页面明显位置提供原文链接并注明出处。欢迎您在转载本文时保留本段声明。
- 文章标题: [C,VB]使用递归位运算实现对字节的中心转置反转算法
- 独立博客: 李大仁博客
- 永久链接:http://www.lidaren.com/archives/697
--------------------------------------------------------------------------------------
以上内容由博客自动发布工具自动发布,最终显示内容和效果会与原文内容有所偏差,敬请谅解。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值