关于c++c语言移位运算的问题

C/C++ 结构体通过指针移位取值_Linux编程_Linux公社-Linux系统门户网站
你好,游客
C/C++ 结构体通过指针移位取值
来源:Linux社区&
作者:xkyxbdx
C/C++ 结构体通过指针移位取值代码示例:
int _tmain(int argc, _TCHAR* argv[]){#pragma pack(1)& & typedef struct{& & & && & & && & & && & & & char z[6];& & }AAA;& & printf("%d\n",sizeof(AAA));& & AAA a = {1,'a',2,"bcdef"};& & AAA* pa = &a;& & int* test1& & & & = (int *)(void *)& & char* test2& & & & = (char *)(void *)(test1+1);& & int* test3& & & & = (int *)(void *)(test2+1);& & char* test4& & & & = (char *)(void *)(test3+1);& & printf("%d ",*test1);& & printf("%c ",*test2);& & printf("%d ",*test3);& & printf("%s", test4);& & return 0;#pragma pack()}
编译器:visual studio2010
注意事项:1、指针执行加减法,是将加减数值乘以该指针类型的大小作为移位的位数,因此需要强转为需要的类型的指针类型作为运算数。2、结构体内不能采用字符自动对齐,必须要用#pragma pack编译制导将对齐最小字符设为1才行,否则偏移取值运算不能到达指定的位置
《C++ 设计新思维》 下载见
C++ Primer Plus 第6版 中文版 清晰有书签PDF+源代码
读C++ Primer 之构造函数陷阱
读C++ Primer 之智能指针
读C++ Primer 之句柄类
将C语言梳理一下,分布在以下10个章节中:
Linux-C成长之路(一):Linux下C编程概要
Linux-C成长之路(二):基本数据类型
Linux-C成长之路(三):基本IO函数操作
Linux-C成长之路(四):运算符
Linux-C成长之路(五):控制流
Linux-C成长之路(六):函数要义
Linux-C成长之路(七):数组与指针
Linux-C成长之路(八):存储类,动态内存
Linux-C成长之路(九):复合数据类型
Linux-C成长之路(十):其他高级议题
本文永久更新链接地址:
相关资讯 & & &
& (04月27日)
& (02月21日)
& (11/07/:20)
& (03月08日)
& (11/07/:29)
& (08/09/:42)
   同意评论声明
   发表
尊重网上道德,遵守中华人民共和国的各项有关法律法规
承担一切因您的行为而直接或间接导致的民事或刑事法律责任
本站管理人员有权保留或删除其管辖留言中的任意内容
本站有权在网站内转载或引用您的评论
参与本评论即表明您已经阅读并接受上述条款实验二 C++数组的循环移位实验报告_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
实验二 C++数组的循环移位实验报告
上传于||文档简介
&&C​+​+​实​验​报​告​,​数​组​循​环​移​位​
​
​⑴​ ​在​原​数​组​中​实​现​循​环​右​移​,​不​另​外​申​请​空​间​
​
​ ​ ​⑵​ ​时​间​性​能​尽​可​能​好​;
阅读已结束,如果下载本文需要使用2下载券
想免费下载本文?
定制HR最喜欢的简历
你可能喜欢(转帖)C++移位运算符
移位运算符可以把整型变量中的内容向左或向右移动指定的位数。移位运算符和其他按位运算符一起使用,可以获得前面描述的结果。&&运算符把位向右移动,&&运算符把位向左移动,移出变量两端的位被舍弃。
所有的按位操作都可以处理任何类型的整数,但本章的例子使用16位的变量,使例子较为简单。用下面的语句声明并初始化一个变量number:
unsigned short number=16387U;
如第2章所述,不带符号的字面量应在数字的最后添加字母U或u。
在下面的语句中,对这个变量的内容进行移位,并存储结果:
unsigned short result = number
&&2; //Shift left two bit
移位运算符的左操作数是要移位的值,右操作数指定要移动的位数。图3-2列出了该操作的过程。
图3-2 移位运算
从图3-2可以看出,把数值16387向左移动两位,得到数值12。数值的这种剧烈变化是舍弃高位数字的结果。
把数值向右移动,可以使用下面的语句:
result = number &&2; //Shift
right two bit positions
把数值16387向右移动两位,得到数值4096。向右移动两位相当于使该数值除以4。
只要没有舍弃位,向左移动n位就相当于把该数值乘以2的n次方。换言之,就等于把该数值乘以2n。同样,向右移动n位就
相当于把该数值除以2的n次方。但要注意,变量number向左移位时,如果舍弃了重要的位,结果就不是我们希望的那样了。可是,这与乘法运算并没有不
同。如果把2字节的数值乘以4,就会得到相同的结果,所以向左移位和相乘仍是等价的。出现问题的原因是相乘的结果超出了2字节整数的取值范围。
如果需要修改原来的值,可以使用op=
赋值运算符。在这种情况下,可以使用&&=或&&=运算符。例如:
number &&= 2; // Shift contents
of number two positions to the right
这等价于:
number =number && 2; // Shift
contents of number two positions to the right
这些移位运算符跟前面用于输入输出的插入和提取运算符有可能搞混。从编译器的角度来看,其含义一般可以从上下文中判断出来。否则,编译器就会生成一个消息,但用户需要非常小心。例如,如果输出变量number向左移动两位的结果,就应编写下面的代码:
cout && (number
其中,括号是必不可少的。没有括号,编译器就会把移位运算符解释为流插入运算符,从而得不到想要的结果。
按位移动带符号的整数
可以把移位运算符应用于带符号和不带符号的整型数。但是,向右移位运算符在带符号整数类型的操作随系统的不同而不同,这取决于编译器的实现。在一些情况下,向右移位运算符会在左边空出来的位上填充0。在其他情况下,符号位向右移动,在左边空出来的位上填充1。
移动符号位的原因是为了保持向右移位和除法运算的一致性。可以用char类型的变量来说明这一点,解释其工作原理。假定把value定义为char类型,其初始值为&104(十进制):
signed char value=&104;
其二进制表示为。使用下面的操作把它向右移动两位:
value &&= 2; //Result
注释中显示了其二进制结果。右边溢出了两个0,因为符号位是1,就在左边空出来的位上填充1。该结果的十进制表示是&26,这正好是value的值除以4的结果。当然,对于不带符号的整数类型的操作,符号位不移动,在左边空出来的位上填充0。
前面说过,在向右移位负整数时,其操作是已定义好的,所以实现该操作时不一定要依赖它。因为在大多数情况下,使用这些运算符是为了进行按位操作,此时维护位模式的完整性是非常重要的。所以,应总是使用不带符号的整数,以确保避免高阶位的移位。
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。教你如何在C语言使用位运算实现循环移位 - C++技巧 - 大学IT网
当前位置: >
> 教你如何在C语言使用位运算实现循环移位
关键词:&&阅读(1346) 赞(11)
[摘要]本文是对教你如何在C语言使用位运算实现循环移位的讲解,对学习C++编程技术有所帮助,与大家分享。
  循环移位区别于普通移位的是移位时没无数位的丧失。循环左移时,用从右边移出的位填充字的右端,而循环右移时,用从左边移出的位填充字的左侧。这种状况在零碎顺序中时有运用,在一些控制顺序中用得也不少。
  设无数听说明:
  a=,循环左移2位 正确后果:
  进程:
  b=a&&(8-2) 用来失掉正常左移丧失的位和循环移位后其正确地位 b=;
  a=a&&2;左移 a=
  a=a|b; a=
  假定不是用两头变量 a=(a&&(8-2))|(a&&2)
  总长度N(8 16 32)
  循环左移n (a&&(N-n))|(a&&n)
  循环右移n (a&&(N-n))|(a&&n)
  C言语的位运算功用是其区别于其他大少数初级顺序设计言语的特征之一,用它可以方便完成一些特殊功用,灵敏掌握是用C顺序编写零碎顺序的根底。
相关C++技巧推荐c++移位操作源操作数是否改变
[问题点数:20分,结帖人s]
c++移位操作源操作数是否改变
[问题点数:20分,结帖人s]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
2006年4月 Java大版内专家分月排行榜第三
本帖子已过去太久远了,不再提供回复功能。

我要回帖

更多关于 c 移位操作 的文章

 

随机推荐