C语言: c位运算算问题 有几句话不理解: 求解释(不胜感激)

关于C语言的 位运算问题_百度知道
关于C语言的 位运算问题
}我写完之后
通过编译之后执行
得到的CMD框显示的不是更改后的文章··求高手指点错误 谢谢··StrCharJL函数有问题吗;
fp=fopen(& if(ReadDat()){
printf(&maxline,fp).DAT&quot:每行的宽度均小于80个字符(含标点符号和空格),xx[i]); char *p!&#92。最后把已处理的字符串仍按行重新存入字符串数组xx中;\return 0。注意;void StrCharJL(void){OUT7.h& for(i=0;4; WriteDat();fclose(fp);r&.h&#include &;i&lt,其字符的ASCII值小于等于32或大于100.DAT&n&%s\4)& } StrCharJL();j&i++){
printf(&*文章的总行数*/ }maxline=i;
return,得到的新字符仍存入原字符串对应的位置上,&);maxline,&#39,xx[i]);
fprintf(cls& for(i=0;IN;}void WriteDat(void){ FILE *}int ReadDat(void){ FILE *w&);;4)&
xx[i][j]=xx[i][j]+xx[i][j]&j++)
if((xx[i][j]&n\ if((fp=fopen(&007&),其功能是;void WriteDat(void);100) 数据文件IN;;& system(&int maxline=0;))==NULL) return 1;
原始数据文件存放的格式是;
if(p)*p=0;=32||(xx[i][j]&lt。DAT中;i++) {
str=strlen(xx[i]);cls&quot,如果左移后;char xx[50][80];str!=NULL){
p=strchr(xx[i],80; } fclose(fp),&#include&);n&#39,最后调用函数WriteDat()把结果xx输出到文件OUT;n& }}void main() { system(&quot.h&&&#include &%s&#92,则原字符保持不变;i&/ while(fgets(xx[i]。StrCharJL()是自己写的··其他的部分已经给出#include &lt.h&gt,否则就把左移后的字符ASCII值再加上原字符ASCII值:以行为单位把字符串中所有字符的ASCII值左移4位; int i=0;int ReadDat(void)函数ReadDat()实现从文件IN,请编制函数StrCharJL()。DAT中读取一篇英文文章存入到字符串数组xx中,j:部分程序已经给出,&).DAT不能打开
4).要注意 运算符优先问题;&lt.xx[i][j]+xx[i][j]&不要漏括号;4;不同于xx[i][j]+ (xx[i][j]&&lt未细看
其他类似问题
为您推荐:
位运算的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁keil软件里有个c语言问题求教_百度知道
keil软件里有个c语言问题求教
16”哪儿不同;(t2值多少)
if(t1==(u8)~t2)return t1,t2;24;(t1值多少)
t2=a是这样定义的;那么t1;&&gt:u32 a?还有这句“t2=(a&gt?求大神解答啊;t1=a&gt。谢谢了;(t2值多少)if(t1==(u8)~t2){
t1=a&gt?(见括号);&gt,与上ff不就是本身么;&}return 0?和“t2=a&gt。假设我a的值是00ff4ab5;这是判断反码和原码是否一致的程序;(t1值多少)t2=(a&gt,u32可以直接赋值给u8么;16)&0xff”;&gt?那if里面的判定为什么还要加上(u8)这个强制转换符,都是取低8位;u8 t1?是不是无论如何右移,t2从上到下的值分别为多少;8;16)&0xff
我有更好的答案
可能包含多种平台的取决于你所用的编译器/平台的默认数据类型。“Keil”本身只是个界面哦,对于MDK而言默认数据为32位。运算过程按照运算顺序依次进行运算和降级/升级。对于PK51而言默认数据为8位
我是32位的arm处理器编写的。总觉得第一次t1和t2的运算应该和第二次的形式类似,都是8位8位取出来,可形式却是不一样,所以不大懂啊。。。
t1为0x00t2为0xFFu32可以赋值给u8,结果是最低8位if里面那个转u8的强制类型转换是为了避免某些编译情况下自动升级造成比较不匹配“还有这句“t2=(a&&16)&0xff”,与上ff不就是本身么?”,要注意运算过程中是u32类型
看t2两次运算符号。第一次是t2=(a&&16)&0xff(功能是把ff取出来,所以要位运算),第二次是t2=a(类似的,是把最后两位取出来,也就是b5),那为什么第二次的运算没用t2=a&0xff呢?同样,第一次的可以用t2=a&&16么?
我也遇到了这个问题,if括号里的(u8)还必须存在,没有就不能正常工作,想不通
t1=0x00t2=0xfft1=4at2=b5可以直接赋值,高位截断就是了。是的。不加U8也可以是的。与FF主要是把高位清0.比如0X1234&0XFF=0X34都是基本的位运算。研究下就会了。
其他类似问题
为您推荐:
keil的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁C语言位运算详解
位运算是指按二进制进行的运算。在系统软件中,常常需要处理二进制位的问题。C语言提供了6个位操作运算符。这些运算符只能用于整型操作数,即只能用于带符号或无符号的char,short,int与long类型。
C语言提供的位运算符列表:
运算符含义描述
&&按位与&&&&&&如果两个相应的二进制位都为1,则该位的结果值为1,否则为0
|&按位或&&&&&&两个相应的二进制位中只要有一个为1,该位的结果值为1
^&按位异或&&&&若参加运算的两个二进制位值相同则为0,否则为1
~&取反&&&&&&&&~是一元运算符,用来对一个二进制数按位取反,即将0变1,将1变0
&&&左移&&&&&&&用来将一个数的各二进制位全部左移N位,右补0
&&&右移&&&&&&&将一个数的各二进制位右移N位,移到右端的低位被舍弃,对于无符号数,&&&&&&&&&&&&&&&&&高位补0
1、“按位与”运算符(&)
&&&&按位与是指:参加运算的两个数据,按二进制位进行“与”运算。如果两个相应的二进制位都为1,
则该位的结果值为1;否则为0。这里的1可以理解为逻辑中的true,0可以理解为逻辑中的false。按位与其
实与逻辑上“与”的运算规则一致。逻辑上的“与”,要求运算数全真,结果才为真。若,
A=true,B=true,则A∩B=true&例如:3&5&3的二进制编码是11(2)。(为了区分十进制和其他进制,本文规
定,凡是非十进制的数据均在数据后面加上括号,括号中注明其进制,二进制则标记为2)内存储存数据
的基本单位是字节(Byte),一个字节由8个位(bit)所组成。位是用以描述电脑数据量的最小单位。二
进制系统中,每个0或1就是一个位。将11(2)补足成一个字节,则是(2)。5的二进制编码是
101(2),将其补足成一个字节,则是(2)
按位与运算:
由此可知3&5=1
c语言代码:
#include&&stdio.h&
&int&b&=&5;
&printf("%d",a&b);
按位与的用途:
若想对一个存储单元清零,即使其全部二进制位为0,只要找一个二进制数,其中各个位符合一下条件:
原来的数中为1的位,新数中相应位为0。然后使二者进行&运算,即可达到清零目的。
例:原数为43,即(2),另找一个数,设它为148,即(2),将两者按位与运算:
c语言源代码:
#include&&stdio.h&
&int&a=43;
&int&b&=&148;
&printf("%d",a&b);
(2)取一个数中某些指定位
若有一个整数a(2byte),想要取其中的低字节,只需要将a与8个1按位与即可。
(3)保留指定位:
与一个数进行“按位与”运算,此数在该位取1.
例如:有一数84,即(2),想把其中从左边算起的第3,4,5,7,8位保留下来,运算如下:
即:a=84,b=59
&&&&c=a&b=16
c语言源代码:
#include&&stdio.h&
&int&a=84;
&int&b&=&59;
&printf("%d",a&b);
2、“按位或”运算符(|)
两个相应的二进制位中只要有一个为1,该位的结果值为1。借用逻辑学中或运算的话来说就是,一真为真
例如:60(8)|17(8),将八进制60与八进制17进行按位或运算。
c语言源代码:
#include&&stdio.h&
&int&a=060;
&int&b&=&017;
&printf("%d",a|b);
应用:按位或运算常用来对一个数据的某些位定值为1。例如:如果想使一个数a的低4位改为1,则只需要
将a与17(8)进行按位或运算即可。
3、“异或”运算符(^)
他的规则是:若参加运算的两个二进制位值相同则为0,否则为1
即0∧0=0,0∧1=1,1∧0=1,&1∧1=0
&&&&例:&&&
&&&&&&&&∧&
&&&&&&&&&&&
c语言源代码:
#include&&stdio.h&
&int&a=071;
&int&b&=&052;
&printf("%d",a^b);
(1)使特定位翻转
设有数(2),想使其低4位翻转,即1变0,0变1.可以将其与(2)进行“异或”运算,
运算结果的低4位正好是原数低4位的翻转。可见,要使哪几位翻转就将与其进行∧运算的该几位置为1
(2)与0相“异或”,保留原值
例如:012^00=012
因为原数中的1与0进行异或运算得1,0^0得0,故保留原数。
(3)&交换两个值,不用临时变量
例如:a=3,即11(2);b=4,即100(2)。
想将a和b的值互换,可以用以下赋值语句实现:
&&&&a=a∧b;
&&&&b=b∧a;
&&&&a=a∧b;
a=011(2)
&&&&(∧)b=100(2)
a=111(2)(a∧b的结果,a已变成7)
&&&&(∧)b=100(2)
b=011(2)(b∧a的结果,b已变成3)
&&&&(∧)a=111(2)
a=100(2)(a∧b的结果,a已变成4)
等效于以下两步:
&&&&①&执行前两个赋值语句:“a=a∧b;”和“b=b∧a;”相当于b=b∧(a∧b)。
&&&&②&再执行第三个赋值语句:&a=a∧b。由于a的值等于(a∧b),b的值等于(b∧a∧b),
因此,相当于a=a∧b∧b∧a∧b,即a的值等于a∧a∧b∧b∧b,等于b。
很神奇吧!
c语言源代码:
#include&&stdio.h&
&int&b&=&4;
&printf("a=%d&b=%d",a,b);
4、“取反”运算符(~)
他是一元运算符,用于求整数的二进制反码,即分别将操作数各二进制位上的1变为0,0变为1。
例如:~77(8)
#include&&stdio.h&
&int&a=077;
&printf("%d",~a);
5、左移运算符(&&)
左移运算符是用来将一个数的各二进制位左移若干位,移动的位数由右操作数指定(右操作数必须是非负
值),其右边空出的位用0填补,高位左移溢出则舍弃该高位。
例如:将a的二进制数左移2位,右边空出的位补0,左边溢出的位舍弃。若a=15,即(2),左移2
位得(2)。
#include&&stdio.h&
&int&a=15;
&printf("%d",a&&2);
左移1位相当于该数乘以2,左移2位相当于该数乘以2*2=4,15<<2=60,即乘了4。但此结论只适用于该
数左移时被溢出舍弃的高位中不包含1的情况。
&&&&假设以一个字节(8位)存一个整数,若a为无符号整型变量,则a=64时,左移一位时溢出的是0
,而左移2位时,溢出的高位中包含1。
6、右移运算符(&&)
右移运算符是用来将一个数的各二进制位右移若干位,移动的位数由右操作数指定(右操作数必须是非负
值),移到右端的低位被舍弃,对于无符号数,高位补0。对于有符号数,某些机器将对左边空出的部分
用符号位填补(即“算术移位”),而另一些机器则对左边空出的部分用0填补(即“逻辑移位”)。注
意:对无符号数,右移时左边高位移入0;对于有符号的值,如果原来符号位为0(该数为正),则左边也是移
入0。如果符号位原来为1(即负数),则左边移入0还是1,要取决于所用的计算机系统。有的系统移入0,有的
系统移入1。移入0的称为“逻辑移位”,即简单移位;移入1的称为“算术移位”。
例:&a的值是八进制数113755:
&&&a:1101&(用二进制形式表示)
&&&a&&1:&0110&(逻辑右移时)
&&&a&&1:&0110&(算术右移时)
&&&在有些系统中,a&&1得八进制数045766,而在另一些系统上可能得到的是145766。Turbo&C和其他一些C
编译采用的是算术右移,即对有符号数右移时,如果符号位原来为1,左面移入高位的是1。
#include&&stdio.h&
&int&a=0113755;
&printf("%d",a&&1);
7、位运算赋值运算符
位运算符与赋值运算符可以组成复合赋值运算符。
&&&例如:&&=,&|=,&&&=,&&&=,&∧=
&&&例:&&a&&&=&b相当于&a&=&a&&&b
&&&&&&&&&a&&&&=2相当于a&=&a&&&&2
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。简单C语言问题代码,有几句我看不懂 请你们给我讲下, 不胜感激 (八进制转十进制)_百度知道
简单C语言问题代码,有几句我看不懂 请你们给我讲下, 不胜感激 (八进制转十进制)
/&#47.h&&#47?dest[j]-'
这里的循环条件(
printf(&0&#39.d1 d2 d3 ;
/: \/8+'index||num .Dm[10]
&#47.; j++)
&#47./Ca//;
是什么意思 有什么作用/SAMPLE OUTPUT
&#47.%s[10]\
src[i]-'0.
&#47.;&#47: ZOJ Monthly.]
/for(i=strlen(src)-1; where the left side is the input (in octal);
j&lt.;/#include&lt.[10]
/SAMPLE INPUT
// i--)
int num=src[i]-'/0&#39,j;write a program to convert octal numerals between 0 and 1;/(8*8))in decimal/digits (0~7).0001
&#47,&src);&#47.]=0;);&#47.Each input number has the form 0;//实现八进制的精度运计算/Fractions in octal( base 8) not can be expressed excatly in decimal notation!=EOF){
&#47:0).75[8]=0;0;}
printf(&A%s&quot.e&#47.h&\/ } index=j,
inclusive, into equival
while(scanf(& for(j=0;
/%s[8] =0;&#47... F}; index|| num ) 怎么理解 { temp=num*10+(j&lt.The这里应该可以接受多组数据/&#47.h&, Zejun/t****Please input some octal digits,dest).; i&/#define MaxN 100int main(){char src[MaxN];&#47:*****\
这句话我也不明白 为什么num 是乘
还有(j&/0;: WU,&#47,src.&#47,n&
/, January 2008#include&lt, 0;n%s&quot,src);;#include&lt.Your output will consist of a sequence of the form
/1.dk.[10]/0&#39.75
&#47.75 in octal is 0;
应该自定义一个字符数组接受数据 0'cons8+5/
num=temp%8;0;/This octal number is //&#47.d-1 d-2 d-3 d-4 d-5: }return 0;
这里是什么意思int index=0;n&quot:0)又怎么理解
dest[j]=temp&#47.The input to your program will&#47..;0;All octal numbers of n digits to the right of the octal point can be expressed in no more than 3n decimal dights to the right of the decimal/&#47. There must 0;0' printf(&quot./, and the right hand side the decimal(base 10) equivalent .., where the d-i are octal &#47?dest[j]-'char dest[MaxN]={'
0;/Source.D1 D2 D3 .Dm is not equal to 0;/&#47.dk[8]=0
提问者采纳
是什么意思 有什么作用/‘5’-';得到实际数值;&#47!=0) temp=num*10+(j&0'5'/0'};
这里是什么意思/0'条件判断;0'&#47?dest[j]-'else return 0;
&#47,可理解为 if(j&;将dest全部初始化成'
src[i]-',则经过转换后num=5
/0&#39:0)又怎么理解//j& int num=src[i]-'
这句话我也不明白 为什么num 是乘
/0'0’=5 for(j=0?dest[j]-'
这里的循环条件(
j& index|| num ) 怎么理解/;8 (j&0&#39。如src[i]='index||进制转换计算需要 小数位第一位7转换成十进制计算 7*10/ j++)
/&#47:0);index和num两个条件都需要满足 num条件基本可理解为(index) return dest[j]-&#39char dest[MaxN]={'&#47
提问者评价
朋友你是高手(&_&)
谢谢上面那位朋友的回答
(》_《))
其他类似问题
为您推荐:
八进制的相关知识
其他1条回答
所以sum*10不知道什么意思j&;}; 因为你的src里面的值为字符;0&#39,不是数字; 把dest里面的元素全部初始化为‘0’int num=src[i]-&#39,相减以后的数才是int类型。 j&index,值为dest[j]-'0',所以要这样,如果小于,例如‘9’-‘0’=9:0意思是判断j是否小与0'index||num 等于( j&lt?dest[j]-'index)||num 还有你的程序没有细看;char dest[MaxN]={'0&#39
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁c语言位运算问题:下面的语句在vc++中运行 为什么打印输出的是-10呢。_百度知道
c语言位运算问题:下面的语句在vc++中运行 为什么打印输出的是-10呢。
ain(){ int a=9,~a);;%d& printf(&quot
提问者采纳
这里的输出相同。另外注意。实际上.,这样保险,除了第一个参数外,unsigned用%u,后面参数列表是,那么当作有符号整数输出:0110,机器数的内存表示(位布局)都是一样的,于是可以输出“正确”(接收正确的整数以错误的方式输出)的结果,unsigned long用%lu.,unsigned short用%hu。由于int和unsigned位数相同,VC++所带的库实现会把unsigned short补为unsigned再输出,int和unsigned的9都是。LZ的例子中,对于unsigned来说当然还是整数。所以把类型和格式字符对应是很有必要的。~计算即按位取反以后就变成,给出的是%d,对于相同的整数,导致printf接收的整数结果就是错的,例如unsigned short和int就不一定了。这个数由于开头是1,我偷懒少打几个字- -),在32位平台上会多取两个字节,但是gcc之类可能直接把unsigned short当作unsigned.,所以对于int来说是负数,对于不一样大小的整数之间,值确实是有区别的,那么看起来就是int了,并非受到整数类型的影响,类型需要根据第一个参数中的格式字符串来确定。以16位平台为例(其实现在大部分都是32位平台,也就是不能通过参数列表确定具体类型——printf的实现并不清楚之后参数的实际类型。LZ可以去标准库头文件观察printf的声明。但是:1001,只要位数相同不管是int还是unsigned
参考资料:
来自团队:
其他类似问题
为您推荐:
其他3条回答
不是定义的问题,~a);%d&; printf(&这样main(){ unsigned
~ &quot.主要是前面a有个
哥哥 我就是想对 位 求反知识不明白为什么输出-10,我认为结果应该是10unsigned
int a=9; printf(&%d&,~a);
因为你定义的变量a是int型的,int是有符号数,所以9取反就成了0xFFF6这个数就是有符号数的-10;你最好定义成unsigned int a = 9;就是你想要的结果了.
明白为什么是-10了。可是改成unsigned int a = 9; 输出还是-10,这就不明白了,我觉得应该输出10啊
因为你使用了printf(&%d&,~a);
//%d是输入int型的变量,所以会按有符号数输入,如果你想按无符号输出,你可以使用prinft(&%u&,~a);
//这样就输出10了.
9取反后是-10
所以输出-10;
位运算的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁

我要回帖

更多关于 c位运算 的文章

 

随机推荐