TypeCodes

十六进制字符串异或

十六进制字符串异或是C/C++工作中经常遇到的情况,因此自己写了一个异或方法。程序中关键的三点:

1 关键点一

弄清十六进制字符串异或的思路:一个十六进制字符其实表示的是一个字节的低4位,但是在ASCII码表中,它是作为一个字符,即占用了1个字节。所以需要先把这个字符转换成对应的十进制数(范围是0~15),这个就是int char2int( char input )函数所做的工作;同理在异或完后,需要根据ASCII码表将范围是0~15的字符转换成对应的占用1字节的字符串中的字符,这个就是int int2char( char input )函数所做的工作。

PS:这其实就是前面这两篇文章的提炼—— 《C语言将十进制字符串转成十进制整数》《C语言将十六进制字符串转成十进制整数》

- 阅读剩余部分 -

由学生按某规则依次报数的游戏引发的问题

前段时间Q群里有提问如下,编写程序解决一个学生按规则依次报数的体育游戏问题。编程语言不限,Java, C#, Ruby, C++, Js, Python, Scala, objective-C统统可以,小语种也没问题。

学生按某规则依次报数的游戏

1 问题描述:
你是一名体育老师,在某次课距离下课还有五分钟时,你决定搞一个游戏。此时有100名学生在上课。游戏的规则是:
1. 你首先说出三个不同的特殊数,要求必须是个位数,比如357
2. 让所有学生拍成一队,然后按顺序报数。
3. 学生报数时,如果所报数字是第一个特殊数(3)的倍数,那么不能说该数字,而要说Fizz;如果所报数字是第二个特殊数(5)的倍数,那么要说Buzz;如果所报数字是第三个特殊数(7)的倍数,那么要说Whizz
4. 学生报数时,如果所报数字同时是两个特殊数的倍数情况下,也要特殊处理,比如第一个特殊数和第二个特殊数的倍数,那么不能说该数字,而是要说FizzBuzz, 以此类推。如果同时是三个特殊数的倍数,那么要说FizzBuzzWhizz
5. 学生报数时,如果所报数字包含了第一个特殊数,那么也不能说该数字,而是要说相应的单词,比如本例中第一个特殊数是3,那么要报13的同学应该说Fizz。如果数字中包含了第一个特殊数,那么忽略规则3和规则4,比如要报35的同学只报Fizz,不报BuzzWhizz

现在,我们需要你完成一个程序来模拟这个游戏,它首先接受3个特殊数,然后输出100名学生应该报数的数或单词。比如,

输入
3,5,7
输出(片段)

1
2
Fizz
4
Buzz
Fizz
Whizz
8
Fizz
Buzz
11
Fizz
Fizz
Whizz
FizzBuzz
16
17
Fizz
19
Buzz

一直到100

- 阅读剩余部分 -

理解有符号和无符号的字符数和整数的转换

网上关于有符号、无符号字符转换成有符号、无符号整形数据的问题,自己写了一个测试程序,分析了下,挺有意思的。

1 测试说明

用的是自己的win7 64位系统,处理器当然是Intel的,因此是前文提到的小端模式。默认按32位(总线)处理,即一个整型4个字节,长度共 2^32 = 4294967296 字节;有符号字符char类型数据的范围是 -128~127 (对应二进制 11111111~01111111),无符号字符 unsinged char 类型数据范围是 0~255(对应二进制 00000000~11111111)。

C语言有符号和无符号数

- 阅读剩余部分 -

C语言字节序的大小端模式

关于字节序的大小端模式,个人认为CSDN上Hackbuteer1作者的这篇文章《大端模式和小端模式》讲解的很清晰。这里MARK一下自己的学习心得:

C程序内存映射模式

1 原文精华
小端模式[Little-Endian]:内存块低地址存放元素的低位(字节),内存块高地址存放元素的高位(字节)
大端模式[Big-Endian]:内存块低地址存放元素的高位(字节),内存块高地址存放元素的低位(字节)

采用小端模式的处理器包括:PDP-11、VAX、Intel系列微处理器和一些网络通信设备; 采用大端模式的处理器包括:IBM3700系列、PDP-10、Mortolora微处理器系列和绝大多数的RISC处理器

- 阅读剩余部分 -

C语言将十进制字符串转成十进制整数

通过上一篇文章完成了十六进制字符串转成十进制整数,同理也很容易写出十进制字符串转成十进制整数的函数。考虑到十进制的字符串中可能会出现正负号,即转换后可能出现负整数,同样也增加了对这种情况的处理。例如将十进制的字符串"0621"、"+621"、"6210"、"-1234"转换十进制的整数,即621、621、6210、-1234。下面同样是正向和逆向两种方法的具体代码:

- 阅读剩余部分 -

C语言将十六进制字符串转成十进制整数

C/C++处理十六进制文件中的报文内容时,经常会遇到先读取报文头中的长度(例如"E2"、"1F"、"-eE2"等等),再读取报文体中的内容的情况。那么就需要把报文头中表示长度的十六进制字符串转换成十进制的整形数据。

转换方法有两种,一种是正向从字符串低位到高位依次转换,另一种是逆向从字符串高位到低位依次转换。原理都是利用指针变量依次指向十六进制字符串中的单个字符,然后通过ASCII码表转换成对应的整数。考虑到十进制的字符串中可能会出现正负号,即转换后可能出现负整数,所以增加了对这种情况的处理。下面是两种方法的具体代码:

- 阅读剩余部分 -