メッセージの表示
13949 ワード
注意点
練習問題
2.1
A. 0x39A7F8 =
0011 1001 1010 0111 1111 1000
B. 1100 1001 0111 1011 = 0xC98B ->0xC97B
C. 0xD5E4C =
1100 0101 1110 0100 1010 -> 1101 0101 1110 0100 1100
D. 10 0110 1110 0111 1011 0101 = 0x26E7C5 -> 0x26E7B5
2.2
210=1024,2 n=2 k∗4+b=2 b 000(k個0)220=1024∗1024=100000+48000+576=10485776
n
2 n 10進法
2 n 16進法
9
512
0x200
19
524288
0x80000
14
16384
0x4000
16
65535
0x10000|
17
131072
0x10000->0x20000
5
32
0x10->0x20
7
128
0x80
2.3
167 = 16 * 10 + 7
じっしん
バイナリ
16進数
0
0000 0000
0x00
167
1010 0111
0xA7
62
0011 1100-> 0011 1110
0x3D->0x3E
188
1011 1100
0xCD->0xBC
55
0011 0111
0x37
136
1000 1000
0x88
243
1111 0011
0xF3
82
0101 0010
0x52
172
1010 1100
0xAC
231
1110 0111
0xE7
2.4
A. 0x503c + 0x8 =
0x5044
B. 0x503c - 0x40 = 0x4ffc
C. 0x503c + 64 = 0x503c +0x40 = 0x507c
D. 0x50ea-0x503c = 0xad->0xae
2.5
*
小端
大端
A
21
87
B
21 43
87 65
C
21 43 65
87 65 43
2.6
2.7
#include <stdio.h>
#include <cstring>
typedef unsigned char* byte_pointer;
void show_bytes(byte_pointer start,int len) {
for (int i = 0;i < len;i ++) {
printf(" %.2x",start[i]);
}
puts("");
}
void show_int(int x) {
show_bytes((byte_pointer)&x,sizeof(int));
}
void show_float(float x) {
show_bytes((byte_pointer)&x,sizeof(float));
}
void show_pointer(void *x) {
show_bytes((byte_pointer)&x,sizeof(void *));
}
int main() {
const char *s = "abcdef";
show_bytes((byte_pointer)s,strlen(s));
}
2.8
えんざん
結果
a
[0110 1001]
b
[0101 0101]
~a
[1001 0110]
~b
[1010 1010]
a & b
[0100 0001]
a
[0111 1101]
a ^ b
[0011 1100]
2.9
A.
-
-
111
011
110
010
101
001
100
000
B. 1. 001|010=011青緑2.110&011=010グリーン3.100^101=001青色
2.10
#include <stdio.h>
#include <cstring>
#include <iostream>
using namespace std;
void inplace_swap(int *x,int *y) {
*y = *x ^ *y;
*x = *y ^ *x;
*y = *y ^ *x;
}
int main() {
int a = 1;
int b = 2;
inplace_swap(&a,&b);
cout <<a << " " << b << endl;
}
2.11
#include <stdio.h>
#include <cstring>
#include <iostream>
using namespace std;
void inplace_swap(int *x,int *y) {
*y = *x ^ *y;
*x = *y ^ *x;
*y = *y ^ *x;
}
void reverse_array(int a[],int cnt) {
int first, last;
for (first = 0,last = cnt-1;first **<=** last;first ++,last --) {
inplace_swap(&a[first],&a[last]);
}
for (int i = 0;i < cnt;i ++) {
cout << a[i] << " " ;
}
cout << endl;
}
int main() {
int a[5] = {1,2,3,4,5};
reverse_array(a,5);
}
2.12
A.
x & 0xff
B. x ^ (~0xff)
C. x | 0xff
2.13
or:
bis(x,y)
xor:LEARNED: bis(bic(x,y),bic(y,x))
bic(x,m)=x&~m x^y=(x&~y)|(y&~x)2.14
x = 0x66,y = 0x39 x = 0110 0110 y = 0011 1001
式#シキ#
値
x & y
0010 0000
x | y
0111 1111
~x | ~y
1101 1111
x & !y
0100 0110 -> 0000 0000
x && y
0x1
x || y
0x1
!x || !y
0x0
x && ~y
0x0
2.15
x & ~y == 0 -> !(x ^ y)
2.16
16進数
バイナリ
バイナリx<<3
16進法x<<3
バイナリx>>2
16進法x>>2
バイナリx>>2
16進法x>>2
0xC3
1100 0011
0001 1000
0x18
0011 0000
0x30
1111 0000
0xf0
0x75
0111 0101
1010 1000
0xA8
0001 1101
0x1D
0001 1101
0x1D
0x87
1000 0111
0011 1000
0x38
0010 0001
0x21
1110 0001
0xE1
0x66
0110 0110
0011 0000
0x30
0001 1001
0x19
0001 1001
0x19
2.17
16進数
バイナリ
符号なし
ほすう
0xE
1110
14
-2
0x0
0000
0
0
0x5
0101
5
5
0x8
1000
8
-8
0xD
1101
13
-3
0xF
1111
15
-1
2.18
16進数
バイナリ
0x1b8
440
0x14
20
0xffff fe58
0x258 = -424
0xffff fe74
0x1e74 = 0x274 = 4 + 16*7-2*256 = 116-512 = -396
0x44
68
0xffff fec8
0x2c8 = 8 + 12*16 - 2 * 256=200 - 512 = -312
0x10
16
0xc
12
0xffff feec
0x2ec = 12 + 16*14 - 2 * 256 = -500 + 224 = -276
0x20
32
2.19
x
T2U4(x)
-8
8
-3
13
-2
14
-1
15
0
0
5
5
2.20
2.21
式#シキ#
を選択します.
値を求める
-2147483647-1==2147483648U
符号なし
1
-2147483647-1 < 2147483647
記号付き
1
-2147483647-1U <2147483647
符号なし
0
-2147483647-1<-2147483647
記号付き
1
-2147483647-1U <-2147483647
符号なし
1
2.22
2.23
w
fun1(w)
fun2(w)
0x00000076
0x00000076
0x00000076
0x87654321
0x00000021
0x00000021
0x000000C9
0x000000C9
0xFFFFFFC9
0xEDCBA987
0x00000087
0xFFFFFF87
2.24
NビットからMビットになり、符号数がなければ直接x mod 2^M符号数があればまず符号数がないと見なしてから符号数があれば(x+2^N)%(2^M)=x%2^Mとなるので、符号数があっても符号数がなければmod 2^M、そして符号数があれば処理する
元の値
符号なし
ほすう
0
0
0
2
2
2
9
1
1
11
3
3
15
7
-1
元の値
符号なし
ほすう
0
0
0
2
2
2
-7
9
1
-5
11
3
-1
15
-1
2.25
エラーの原因:unsigned int-1は実際には最大値に等しく、i<=最大値は真に保たれます.
float sum_elements(float a[],unsigned length) {
int i;
float result = 0;
for (i = 0,`i <= length-1`;i ++) {
result += a[i];
}
return result;
}
i < length
int length
2.26
size_t strlen(const char* s);
int strlonger(char* s,char *t) {
reutnr strlen(s) - strlen(t) > 0;
}
strlen(s) > strlen(t)
まとめ
コード#コード#
#include <stdio.h>
typedef unsigned char* byte_pointer;
void show_bytes(byte_pointer start,int len) {
for (int i = 0;i < len;i ++) {
printf(" %.2x",start[i]);
}
puts("");
}
void show_int(int x) {
show_bytes((byte_pointer)&x,sizeof(int));
}
void show_float(float x) {
show_bytes((byte_pointer)&x,sizeof(float));
}
void show_pointer(void *x) {
show_bytes((byte_pointer)&x,sizeof(void *));
}
int main() {
show_int(16);
}