C位移的问题以及其他

sixbird 2010-04-10 09:59:15
第一个问题:这是一个不申请变量和空间反转字符串的问题
我在网上看到一个代码 可以正确运行,但是对其中的一种用法不理解

#include <iostream>
using namespace std;

char* Reverse(char *s)
{
if (strlen(s)==1)
{
return s;
}
if(*s)
{
s[0]=s[0]^s[strlen(s)-1];
s[strlen(s)-1]=s[0]^s[strlen(s)-1];
s[0]=s[0]^s[strlen(s)-1];

//unsigned short gg=(*(s+strlen(s)-1))<<8;
//cout<<gg<<endl;//24832=97*256
*(unsigned short *)(s+strlen(s)-1)=(*(s+strlen(s)-1))<<8; //unsigned short长度为2byte
//左移操作本身并不改变(*(s+strlen(s)-1))的值


Reverse(s+1);
*(unsigned short *)(s+strlen(s))=(*(s+strlen(s)+1));
return s;
}
else return s;

}

int main()
{
char a[]="abcdef";
cout<<Reverse(a);
return 0;
}

*(unsigned short *)(s+strlen(s)-1)=(*(s+strlen(s)-1))<<8; 这一句百思不得其解,举例来说一下
在第一次递归前字母 a 和f 交换了位置 变成了 fbcdea 最后还有一个结束符‘\0’上面这句语句可以实现 a和'\0'的互换
求解答
详细的好
能帮助我的给分.(*(s+strlen(s)-1))是char型的 左移8位不是全0了吗 a去哪了呢? 看程序运行的结果 知道这个语句能变成 '\0''a'.

C中的位移是直接补零吗?有什么算术位移和逻辑位移分别吗?

第二个问题:如:int a =7;char b='g' 怎么能够cout出变量a和变量b的每个位的具体情况 我的意思就是 如a 能显示出 0000111出来 b显示出它的二进制位

第三个问题:

int main()
{
char a[]="adfdfsdfasd";
cout<<a;//cout<<a[1];
return 0;
}
我的问题是怎么获取字母d的内存地址 我用a[1]的话输出的是字母d 用&a[1]输出的是除了a之后的字符串。谢谢,多答多给分
...全文
204 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
sixbird 2010-04-23
  • 打赏
  • 举报
回复
UPUP
sixbird 2010-04-21
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 littlejohny 的回复:]
问题三

C/C++ code

printf("%p\n",&a[1]);
[/Quote]

用cout怎么写呢 大大教教我
sixbird 2010-04-21
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 luoyongbiao 的回复:]
第一个问题:
"abcdef"共有6个字节的空间可用.*(unsigned short *)(s+strlen(s)-1)=(*(s+strlen(s)-1))<<8;
注意左边,它是s字符串的最后一个字符的位置,.(unsigned short *)强制类型转换后,它指向最后一个字符以及‘\0’字符(2个字节)的空间;然后这个空间的内容被赋值为右边的值。这个就是交换最后一个字符和'\0'字……
[/Quote]

是怎么由 a\0 变成 \0 a的呢
luoyongbiao 2010-04-12
  • 打赏
  • 举报
回复
第一个问题:
"abcdef"共有6个字节的空间可用.*(unsigned short *)(s+strlen(s)-1)=(*(s+strlen(s)-1))<<8;
注意左边,它是s字符串的最后一个字符的位置,.(unsigned short *)强制类型转换后,它指向最后一个字符以及‘\0’字符(2个字节)的空间;然后这个空间的内容被赋值为右边的值。这个就是交换最后一个字符和'\0'字符。
sixbird 2010-04-12
  • 打赏
  • 举报
回复
up up
ameyume 2010-04-12
  • 打赏
  • 举报
回复
在谭的《C程序设计》第三版,讲异或运算符的12.1.3章节里有如下应用
(3)交换两个值,不用临时变量
a = 3, b = 4
则执行
a=a^b;
b=b^a;
a=a^b;
后,a=4,b=3
Thirty 2010-04-12
  • 打赏
  • 举报
回复
看看。。。。
ameyume 2010-04-12
  • 打赏
  • 举报
回复
帮顶,程序里还用到了递归
tink_tink 2010-04-12
  • 打赏
  • 举报
回复
我想问
i为2
i>>(-1)
这个可以解释一下怎么移的么?
qzf368 2010-04-12
  • 打赏
  • 举报
回复
每天回帖即可获得10分可用分
LittleJohny 2010-04-12
  • 打赏
  • 举报
回复
问题三

printf("%p\n",&a[1]);
sixbird 2010-04-11
  • 打赏
  • 举报
回复
still waiting for the answers,somebody help me~~~·
kangyonghui 2010-04-11
  • 打赏
  • 举报
回复
up,等待
sixbird 2010-04-10
  • 打赏
  • 举报
回复
wait for answers
w74839520 2010-04-10
  • 打赏
  • 举报
回复
第二个问题:如:int a =7;char b='g' 怎么能够cout出变量a和变量b的每个位的具体情况 我的意思就是 如a 能显示出 0000111出来 b显示出它的二进制位

C中不能以二进制直接算出

你可以在源代码中,编写程序进行划算。

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧