论坛: 编程破解 标题: 字节倒置!!斑竹,高手进来看一下 复制本贴地址    
作者: jzit_wmm [jzit_wmm]    论坛用户   登录
如一字节 00000001 倒置后 10000000;题目如下: 有一缓冲区里有n个字节,都倒置后装入 另一个缓冲区。(最好,将倒置前后的数在屏幕上 显示,来加强对比)简化一下,假设n=16。
我想了很久,关键在于寻找对应关系,总是找不到。
画了一下:
0      0000      0      0000
1      0001      8      1000
2      0010      4      0100
3      0011      12    1100
4      0100      2      0010
5      0101      10    1010
6      0110      6      0110
7      0111      14    1110
8      1000      1      0001
9      1001      9      1001
10      1010      5      0101
11      1011      13    1101
12      1100      3      0011
13      1101      11    1011
14      1110      7      0111
15      1111      15    1111


地主 发表时间: 05-05-09 23:05

回复: 286 [unique]   版主   登录
char reverse(char ch,int num)//num是需要处理的位数。
{
    if (num>8) //假设最多位为一个字节,实际上如果超过一个字节,可以按多个“一个字节”方式多次调用该函数。
        return 0;
    char bit1=1,bit2=2^num,ret=0;//如果是八位,bit2=0x80。
    for (int i=0;i<num;i++)
    {
          if ((ch & bit) != 0) //如果某一个不等于0,表示该位为1
                ret|=bit2;      //,则返回值相反的位置1
          bit1*=2;bit2/=2;    //bit1从低到高,bit2从高位到低位,本来二者可以合二为一,但为了看的更清楚,我用了两个变量。注意,乘以2等价于左移,除以等价于右移,另外此处也可以换成左移或右移。
    }
    return ret;
}

如果你的程序只需要整字节的转换,其实可以更简单。
char reverse2(char ch)
{
    char ret;
    switch(ch)
    {
    case 0:ret=0;
    case 1:ret=9;
    ......
    }
    return ret;
}
         

B1层 发表时间: 05-05-10 09:29

回复: jzit_wmm [jzit_wmm]   论坛用户   登录
偶愚笨,看的不太懂,ret这个变量干什么用的,还有bit2=0x80 是什么意思。最好输入数字,举个例子来说明一下你的程序。
如果用汇编实现该 倒置作用,该怎么做。


劳烦版主了。

B2层 发表时间: 05-05-10 16:51

回复: jzit_wmm [jzit_wmm]   论坛用户   登录
自己动手,丰衣足食。
我的汇编,版主高手劳驾看看!!!

data segment
size db ?
data ends
code segment
assume cs:code,ds:data
start: mov ax,data
      mov ds,ax
      mov bx,size
      mov ah,1
      int 21h
      mov dl,al
      mov ah,2
      int 21h
      mov ch,8
remove:mov cl,1
      shr al,cl
      rcl bl,cl
      dec ch
      cmp ch,0
      jnz remove
      mov dl,bl
      mov ah,2
      int 21h
      mov ah,4ch
      int 21h
code ends     
    end  start 


B3层 发表时间: 05-05-13 16:58

回复: wxngzybb [wxngzybb]   论坛用户   登录
各种语言终究解决相同的问题实现相同的算法。无论你用哪种语言,算法不变。给一个算法

1。把一个字节的高低四位互换
2。把1得到的结果的高低4位分别分成两位的对子,各自互换
3。把2得到的结果分成2位一组,共四组,每组的两位互换
4。结束
比如  01001101
1.  1101 0100
2  0111 0001
3  1011 0010
the rusult is 10110010

B4层 发表时间: 05-05-14 00:49

论坛: 编程破解

20CN网络安全小组版权所有
Copyright © 2000-2010 20CN Security Group. All Rights Reserved.
论坛程序编写:NetDemon

粤ICP备05087286号