|
![]() | 作者: 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号