字节的中心转置反转,这是一道的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
C/C++
完整代码下载
http://www.lidaren.com/co de/bytecvt/src.zip
VB运行效果
--------------------------------------------------------------------------------------
- 版权声明:
- 如在本页面内无特别说明,本文内容均为[李大仁博客]原创,本文版权归[李大仁博客]所有。
- 欢迎转载,转载请务必在文章页面明显位置提供原文链接并注明出处。欢迎您在转载本文时保留本段声明。
- 文章标题: [C,VB]使用递归位运算实现对字节的中心转置反转算法
- 独立博客: 李大仁博客
- 永久链接:http://www.lidaren.com/archives/697
--------------------------------------------------------------------------------------
以上内容由博客自动发布工具自动发布,最终显示内容和效果会与原文内容有所偏差,敬请谅解。
原题如下:
给定一个任意字节长度的数据(以一个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/co
VB运行效果
--------------------------------------------------------------------------------------
- 版权声明:
- 如在本页面内无特别说明,本文内容均为[李大仁博客]原创,本文版权归[李大仁博客]所有。
- 欢迎转载,转载请务必在文章页面明显位置提供原文链接并注明出处。欢迎您在转载本文时保留本段声明。
- 文章标题: [C,VB]使用递归位运算实现对字节的中心转置反转算法
- 独立博客: 李大仁博客
- 永久链接:http://www.lidaren.com/archives/697
--------------------------------------------------------------------------------------
以上内容由博客自动发布工具自动发布,最终显示内容和效果会与原文内容有所偏差,敬请谅解。