1、int intvert(unsigned int x,int p,int n)实现对x的进行转换,p为起始转化位, n为需要转换的长度,假设起始点在右边.
如x=0b0001 0001,p=4,n=3转换后x=0b0110 0001。
unsigned int intvert(unsigned int x, int p, int n)
{
if(p > 31 || p < 0 || n << 0)//起始点不能溢出,p,n不能为负
return 0;
while(n--) //如果转换长度过长,则从最右端循环
{
x ^= 1 << p++;
if(p > 31)
p %= 32;
}
return x;
}
2、已知WAV文件格式如下表,打开一个WAV文件,以适当的数据结构组织WAV文件头并解析怎样获取WAV格式的各项信息。
#include <stdio.h>
#include <string.h>
#include <malloc.h>
#define RIFF 0
#define FILE_LEN 1
#define WAVE 2
#define FMT 3
#define TEMP 4
#define FORMAT 5
#define CH_NUM 6
#define SAMP_RATE 7
#define TRANS_RATE 8
#define DATA_ADJUST 9
#define SAMP_BITS 10
#define DATA_MARK 11
#define VDATA_LEN 12
unsigned char valuePosition[] = {0x00, 0x04, 0x08, 0x0C, 0x10, 0x14, 0x16, 0x18, 0x1C, 0x20, 0x22, 0x24, 0x28};
unsigned char valueLen[] = {4, 1, 4, 4, 4, 1, 1, 1, 1, 1, 2, 4, 1};
typedef struct WAVE_HEAD{
unsigned char riffFlag[4];
unsigned int fileLen[1];
unsigned char waveFlag[4];
unsigned char fmtFlag[4];
unsigned char tempBytes[4];
unsigned short format[1];
unsigned short chanNum[1];
unsigned short samplingRate[1];
unsigned int transmissionRate[1];
unsigned short dateAdjustment[1];
unsigned char sampleBitNum[2];
unsigned char dataMarker[4];
unsigned int voiceValueLen[1];
}WAVE_HEAD;
void writeValue(unsigned char *value, WAVE_HEAD *pHeadValue);
//void printValue(unsigned char command, WAVE_HEAD *pHeadValue);
//void dataList();
void writeValue(unsigned char *value, WAVE_HEAD *pHeadValue)
{
int no = 0, len = 0;
for(no = RIFF; no < VDATA_LEN + 1; no++)
{
switch(no)
{
case RIFF:
for(len = 0; len < valueLen[RIFF]; len++)
pHeadValue->riffFlag[len] = value[valuePosition[RIFF] + len];
break;
case FILE_LEN:
for(len = 0; len < valueLen[FILE_LEN]; len++)
pHeadValue->fileLen[len] = value[valuePosition[FILE_LEN] + len];
break;
case WAVE:
for(len = 0; len < valueLen[WAVE]; len++)
pHeadValue->waveFlag[len] = value[valuePosition[WAVE] + len];
break;
case FMT:
for(len = 0; len < valueLen[FMT]; len++)
pHeadValue->fmtFlag[len] = value[valuePosition[FMT] + len];
break;
case TEMP:
for(len = 0; len < valueLen[TEMP]; len++)
pHeadValue->tempBytes[len] = value[valuePosition[TEMP] + len];
break;
case FORMAT:
for(len = 0; len < valueLen[FORMAT]; len++)
pHeadValue->format[len] = value[valuePosition[FORMAT] + len];
break;
case CH_NUM:
for(len = 0; len < valueLen[CH_NUM]; len++)
pHeadValue->chanNum[len] = value[valuePosition[CH_NUM] + len];
break;
case SAMP_RATE:
for(len = 0; len < valueLen[SAMP_RATE]; len++)
pHeadValue->samplingRate[len] = value[valuePosition[SAMP_RATE] + len];
break;
case TRANS_RATE:
for(len = 0; len < valueLen[TRANS_RATE]; len++)
pHeadValue->transmissionRate[len] = value[valuePosition[TRANS_RATE] + len];
break;
case DATA_ADJUST:
for(len = 0; len < valueLen[DATA_ADJUST]; len++)
pHeadValue->dateAdjustment[len] = value[valuePosition[DATA_ADJUST] + len];
break;
case SAMP_BITS:
for(len = 0; len < valueLen[SAMP_BITS]; len++)
pHeadValue->sampleBitNum[len] = value[valuePosition[SAMP_BITS] + len];
break;
case DATA_MARK:
for(len = 0; len < valueLen[DATA_MARK]; len++)
pHeadValue->dataMarker[len] = value[valuePosition[DATA_MARK] + len];
break;
case VDATA_LEN:
for(len = 0; len < valueLen[VDATA_LEN]; len++)
pHeadValue->voiceValueLen[len] = value[valuePosition[VDATA_LEN] + len];
break;
default:
printf("超出范围\n");
break;
}
}
}
int main(void)
{
unsigned char value[0x28+4] = {0};
WAVE_HEAD *pHeadValue = (WAVE_HEAD *)malloc(sizeof(WAVE_HEAD));
FILE *fp = NULL;
if((fp = fopen("flower dance.wav", "rb")) == NULL){
printf("没打开文件.\n");
return 0;
}
// printf("%d\n", fread(value, sizeof(char), 0x28+4, fp));fread()返回的是实际读取的数据的个数;
if((fread(value, sizeof(char), 0x28+4, fp)) != 0x28 + 4){
fclose(fp);
printf("数据没有读取完成\n");
return 0;
}
fclose(fp);
writeValue(value, pHeadValue);
free(pHeadValue);
pHeadValue = NULL;
return 0;
}
3、下面这段代码是把中英文混合字符串(汉字用两个字节表示,特点是第一个字节的最高位是1)中的大写字母转化为小写字母,找出其中的bug。
for (char *piterator=sz_word; *piterator!=0; piterator++)
{
if (*piterator & 0x80 != 0)
{
piterator++;
}
else if (*piterator>='A' && *piterator<='Z')
piterator += 32;
}
修改后:
void A2a(char *sz_word)
{
char *piterator = sz_word;
while(*piterator != '\0')
{
// if(*piterator & 0x80)
// piterator++;
if(*piterator >= 'A' && *piterator <= 'Z')
*piterator += 32;
piterator++;
}
}
练习1:
*
***
*****
***
*
#include <math.h>
#define N 3//边长,设总行数M = 2N-1 = 5
//行数:1,2,3,4,5
//空格数:2,1,0,1,2
//空格数:3-1, 3-2, 3-3, 3-2 = -(3-4), 3-1 = -(3-5)
//*数:1, 3, 5, 3,1
//*数:5-4, 5-2, 5-0, 5-2, 5-4
void printDiamond(void)
{
int i = 0, j = 0;
for(i = 1; i < N * 2; i++)
{
for(j = 0; j < abs(N - i); j++)
printf(" ");
for(j = 0; j < 2*N-1 - 2*abs(N-i); j++)
printf("*");
printf("\n");
}
}
练习2:
***www.baidu.com***
char *s = "www.baidu.com";
printf("***%s***", s);
练习:
1.给定一个整型数a,设置a的bit3(为1),保证其他位不变。
a |= 1 << 3;
2.给定一个整形数a,设置a的bit3~bit7,保持其他位不变。
a |= 0x1f << 3;
3.给定一个整型数a,清除a的bit15,保证其他位不变。
a &= ~(1 << 15);
4.给定一个整形数a,清除a的bit15~bit23,保持其他位不变。
a &= ~(0x1ff << 15);
5.给定一个整形数a,取出a的bit3~bit8。
b = (a & 0x3f << 3) >> 3;
6.用C语言给一个整形数的bit7~bit17赋值937(其余位不受影响)。
a = a & ~(0x7ff << 7) | 937 << 7;
7.用C语言将一个整形数的bit7~bit17中的值加17(其余位不受影响)。
b = (a & 0x7ff << 7) + (17 << 7); //取出7~17位的值并加17,所在位不变
a = a & ~(0x7ff << 7) | (b & 0x7ff << 7); //给7~17位清零, 清除相加后的进位
8.用C语言给一个整形数的bit7~bit17赋值937,同时给bit21~bit25赋值17.
a = a & ~(0x7ff << 7) & ~(0x1f << 21) | 937 << 7 | 17 << 17;