C语言内部存款和储蓄器分析,程序设计在线课笔记

By admin in 4858.com on 2019年4月14日

嘛  事情发生是如此的 由于生成卡号太长(八千3808020548玖 那种)
 又要判断某卡号位于某些区间 再去判断机构
壹初始很天真的直白依据惯性思维来写

范围:-(2 ^ 字节 X 8 – 1)~(2 ^ 字节 X 8 – 1)- 1

 

1.3 位运算
位运算:
用来对整数类型(int,char, long
等)变量中的某一位(bit),也许若干位展开操作。比如:

query = query.Where(x=>x.Code>=MinCode && x.Code<MaxCode);

驷不比舌分裂是数额大小范围:

C语言内部存款和储蓄器分析

  1. 看清某1人是或不是为1
  2. 只改变当中某壹个人,而保持其余位都不变。
    C/C++语言提供了七种位运算符来实行位运算操作:
    & 按位与(双目)
    | 按位或(双目)
    ^ 按位异或(双目)
    ~ 按位非(取反)(单目)
    << 左移(双目)

结果出难点了 233三

  1. byte 三个字节 -12捌 ~ 127

一、进制

右移(双目)

因为那边本身把卡号当做int类型的去做大小判断结果报错

二.short 三个字节 -3276八 ~ 32767

概念:进制是一种计数情势,是数值的表现格局

按位与 “&”日常用来将某变量中的某个位清0且同时保留别的位不变。
也足以用来博取某变量中的某壹位。
诸如,借使急需将int型变量n的低八人全置成0,而其它位不变,则能够执行:
n = n & 0xffffff00;
也能够写成:
n &= 0xffffff00;
假如n是short类型的,则只需实践:
n &= 0xff00;
怎么判定二个int型变量n的第六位(从右往左,从0起初数)是不是是一 ?
只需看表明式 “n & 0x80”的值是或不是等于0x80即可。
0x80: 1000 0000

按理来说应该用long类型 陆人数以下的双边没分别 不过跨越陆位就不行了

三.int 八个字节 -214748364八 ~ 2147483647

四种重大的进制:

按位或 “|”
按位或运算日常用来将某变量中的有个别地点一且保留其余位不变。
比如,假使急需将int型变量n的低6人全置成一,而此外位不变,则足以实施:
n |= 0xff;
0xff: 1111 1111

数量范围不雷同
int -2^31~2^31-1
long long -2^63~^63-1

肆.long 多个字节

①. 十进制:0~9 

按位异或 “^”
按位异或运算经常用来将某变量中的有个别位取反,且保留别的位不变。
譬如,假设须要将int型变量n的低陆人取反,而任何位不变,则足以进行:
n ^= 0xff;
0xff: 1111 1111
异或运算的风味是:
壹经 a^b=c,那么就有 c^b = a以及c^a=b。(穷举法可证)
此原理能够用来进展最不难易行的加密和解密。
别的异或运算仍是可以落实不通过权且变
量,就能交流七个变量的值:
int a = 5, b = 7;
a = a ^ b;
b = b ^ a;
a = a ^ b;
即得以实现a,b值交换。穷举法可证。

所以早先时期处理的方法是这么的

五.char 三个字节

②. 二进制:0和1

左移运算符 “<<”
表达式:
a << b
的值是:将a各二进位1体左移b位后拿走的值。左移时,高位吐弃,低位补0。a
的值不因运算而改变。
实则,左移一位,就等于是乘以贰,左移n位,就相当于是乘以贰的n次方。而左移操作比乘法操作快得多。

query = query.Where(x => x.Code.CompareTo(EndCode) >= 0 && x.Code.CompareTo(MaxCode) <= 0);

结论:在java中,对char实行演算的时候,直接作为ASCII码对应的平头对待.

③. 八进制:0~7

右移运算符 “>>”
表达式:
a >> b
的值是:将a各2进位壹体右移b位后收获的值。右移时,移出最右侧的位就被撇下。
a 的值不因运算而更改。
对于有号子数,如long,int,short,char类型变量,在右移时,符号位(即最高位)将三只运动,并且大部分C/C++编写翻译器规定,要是原符号位为壹,则右移时高位就补给一,原符号位为0,则右移时高位就补充0。
4858.com,实际,右移n位,就也便是左操作数除以贰的n次方,并且将结果往小里取整。
-25 >> 4 = -2
-2 >> 4 = -1
18 >> 4 = 1

此间CompareTo是字符串的可比艺术 

C语言内部存款和储蓄器分析,程序设计在线课笔记。一.骨干数据类型转换

肆. 十六进制:0~9+a b c d e f

思考题
有七个int型的变量a和n(0 <= n <= 3一),
务求写贰个表明式,使该表明式的值和a的第n位相同。
答案:( a >> n ) & 1
另1答案:(a & (一 << n )) >> n

当a>b的时候a.CompareTo(b) == 1

自行转换

C语言在私下认可的情况下为10进制。

当a=b的时候a.CompareTo(b) == 0

int a = 1.2; double = 3;

Int num=1010;//十进制

当a<b的时候a.CompareTo(b) == -1

结论:数据类型能够活动地从低精度——>高精度.

Int num=0b1100;//二进制,以0b或者是0B开头

//byte < short < int < int < long < float < double ;

Int num=014;//八进制,以0开头

在java中,小数默许是double.

Int num=0x4;//十六进制,以0x开头

例: int a = 3;

占位符:

int b = a + 3.4;

%d和%i    :一10进制整数的样式出口二个值

敲定:当一个int类型和2个double类型运算的时候,运算结果会向高精度转.

%o :以不带符号的八进制输出

贰.算术运算符: ++ —

%x :以不带符号的十陆进制输出

+=左加 -=左减 /=左除 %=左取模

%u :以不带符号的10进制输出

. int b = ++a; ==> a = a + 1; b = a;

%c : 输出字符

. int b = a++; ==> b = a; a = a + 1;

%p : 输出地址

  1. int a = 90; ==> a += 90; a = a + 90; ==> a = 180;

  2. float b = 89.7; ==> b = b + a; ==> 89.7 + 180;

%f : 输出小数

提到运算符

%s : 输出字符串

  1. == 等于
  2. > 大于
  3. < 小于
  4. >= 大于等于
  5. >= 小于等于
  6. != 不等于

N位2进制的取值范围:

3大流程序控制制

2位···0~3   0~2的2次方-1

一 分支控制:让程序有取舍的进行,分支控制有二种: 单分支 双分支 多分支

3位···0~7   0~2的3次方-1

  1. 单分支 if {

N位···   0~2的n次方-1

语句;

看清以下数据是或不是正确:

}

0x7h4 0986 .089 0b325 10e8.7 96f -.003 

  1. 双分支 if {

 

语句;

种类的取值:

}else{

在陆13个人编写翻译器下,int类型 占伍个字节 共四x八=32bit char类型 占3个字节 共一x捌=捌bit ,在内部存储器中以字节为单位展打开仓库储。

语句;

 

}

二、内部存款和储蓄器分析

3.多分支 if {

注意:内部存款和储蓄器寻址,由大到小。

语句;

Int a=1;

}else if{

Int b=2;

语句;

 

}else if{

三、类型表达符

语句;

Short== Short int %d 2

}else{

Long ==long int %ld 8

语句;

Long long ==Long long int  %lld 8

}

Signed ==Signed int==int %d 4(有符号)

二 switch语句

Unsigned ==Unsigned int %u 4(无符号)

switch{

Signed和unsigned的界别在于最高位要不要拿来作为标志位,明显后者的取值范围更加大。那多个验证符可和long等证实符组合使用,但不会转移字节数。Unsigned代表int类型的最高位,不必用来作为标志位。

case 常量 1 :

 

语句 1 ;

四、位运算

break;

 (一)按位与 &

case 常量 2 :

功能:唯有对应的几个2进制位均为1时,结果才为一,不然为0。

语句 2 ;

以身作则:玖&五 的结果为1

break;

1001

case 常量 n :

0101

语句 n ;

——

break;

0001

default :

申明:尽管位与上一则保留原值,与上0则为0。

语句 n+1 ;

使用:查询0十一 0111 0000的尾数第几位是0还是一,则足以与上数值以判断,得出的结果是何等,那么它的原值正是何许。

break;

0101 0111 0000

}

0000 0010 0000

//条件表明式数据类型,应和case的常量类型壹致;switch中的可用数据类型首假诺:允许byte,short,int,char,enum等.

0000 0010 0000

叁 循环控制:三种

(二)按位或 |

1.for 循环

职能:只要对应的八个二进制位有2个为1则结果为壹,不然为0。

for(循环开头值;循环条件;步长值){

举例:九|5的结果为一三

语句; //循环体

1001

}

0101

2.while 循环

——

while{

1101

语句; //循环体

(叁)按位异或 ^

}

职能:当对应的四个二进制位不等于时,结果为1,不然为0。

专门表明:while循环是先判断,在推行语句.

比喻:玖^五的结果为:1二

3.do while 循环

1001

do{

0101

语句; //循环体

——

}while;

1100

专程表达:do while 循环是先进行,在判断.

规律:

1. 同样整数异或的结果为0,如5^5=0

二. 顺序能够换到。如九^五^九=九^九^五=0^伍=5

三. 任何数值跟0进行异或,结果照旧本来的数值。9^0=九

④. a^b^a==b

 

(四)按位取反 ~

举例:~9的结果为-10

0000 0000  0000  0000 0000  0000  0000  1001

1111 1111 1111  1111  1111  1111 1111 0110

 

(五)左移 <<

如a<<n

把整数a的二进制位全体左移n位,高位废弃,低位补零。左移n位的结果其实是乘以二的n次方,由于符号位会被撇下,所以结果可能会改变正负性。

比喻:玖<<1的结果为1八

0000 1001

0010 0010

接纳:假设有个别数必要乘以贰的n次方,那么使用位运算效用越来越高。

 

(六)右移 >>

如a>>n

把整数a的二进制位全体右移n位,低位遗弃,符号位不变,1般情况下高位用符号位补齐。右移的结果其实是除以二的n次方。

 

(七)练习

(壹)使用位运算沟通七个变量的值

4858.com 14858.com 2

 1 #include<stdio.h>   2    3 int main()   4    5 {   6    7 int a=10;   8    9 int b=11;  10   11 printf("a=%d,b=%d\n",a,b);  12   13 a=a^b;  14   15 b=a^b;  16   17 a=a^b;  18   19 printf("a=%d,b=%d\n",a,b);  20   21 return 0;  22   23 }

View Code

(2)使用位&运算符判断变量的奇偶性

 

4858.com 34858.com 4

 1 #include<stdio.h>   2    3 int main()   4    5 {   6    7    printf("请输入需要判断的整数:\n");   8    9     int n;  10   11     scanf("%d",&n);  12   13 /*  14   15    if(n%2==0)  16   17    printf("这个数是偶数\n");  18   19    else  20   21    printf("这个数是奇数\n");  22   23 */  24   25     if((n&1)==1)  26    27      printf("这个数是奇数\n");  28   29     else if((n&1)==0)  30   31     printf("这个数是偶数\n");  32   33     return 0;  34   35 }

View Code

 

(三)编写四个函数,输出整数的2进制格式

4858.com 54858.com 6

 1 #include<stdio.h>   2    3 void putbinary(int number);   4    5 int main()   6    7 {   8    9    printf("这个程序的作用是把你输入的整数以二进制的格式输出\n");  10   11    printf("请输入一个整数:\n");  12   13    int n;  14   15    scanf("%d",&n);  16   17    putbinary(n);  18   19    return 0;  20   21 }  22   23    24   25 void putbinary(int number)  26   27 {  28   29      //int count=sizeof(number)*8-1;  30   31       int count=(sizeof(number)<<3)-1;//注意这里需要注明优先级  32   33      printf("%d\n",count);  34   35    36   37 while(count>=0)  38   39 {  40   41     int value=(number>>count)&1;  42   43     printf("%d",value);  44   45 //每四个数字,打印一个空格  46   47     if(count%4==0)  48   49      printf(" ");  50   51      count--;  52   53 }  54   55    56   57 }  58   59  

View Code

 

五、char类型

(一)基础

Char c=‘A’;

字符在内存中也是也二进制的格式存款和储蓄的。

Int num=6;//在内部存款和储蓄器中以00···0110储存

Char num=‘陆’;//对应的ascii码值是5肆=3贰+1陆+四+二,在内部存储器中为1一 01拾

两者之间有着本质的界别,三个是有血有肉的整数值,2个是字符,以ASCII格式存储。

(二)使用注意

单引号只可以括住单字节的字符,ASCII中的全部字符都以单字节的。

Char c=’男’;//错误,因为1当中华夏族民共和国字占据二个字节的蕴藏空间

Char c=”A”;//错误,那是字符串,为‘A’+‘\0’。

Char c=65;//正确,另1种样式而已

Char类型占据二个字节,所以它的取值范围为-12捌~127。

扶助:输出3个\,使用\\,输出贰个单引号使用\’,输出3个双引号,使用\”。

演练:编写3个函数,将小写字母转换为大写。

4858.com 74858.com 8

 1 #include<stdio.h>   2    3     4    5 char upper(char c)   6    7 {   8    9 if(c>='a'&&c<='z')  10   11 return c-('a'-'A');  12   13 else  14   15 return c;  16   17 }  18   19 int main()  20   21 {  22   23 char a=upper('b');  24   25 printf("%c\n",a);  26   27 return 0;  28   29 }

View Code

 


发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图
Copyright @ 2010-2019 美高梅手机版4858 版权所有