7月14日学习,位运算的运算符及含义,一些作业代码

由于今天在写代码时有需要用到位运算,我就查了一些位运算的基本知识。
位运算
c语言既有高级语言特点,又有低级语言的功能,C语言和其他语言的区别就是它完全支持按位运算,也就是我们所说的“位运算”,而且也能像汇编语言一样用来编写系统程序。

运算符含义
&按位与
~取反
^按位异或
<<左移
>>右移

另外还有‘|’表示按位或。
&:运算两个数,转换为二进制后,进行&运算。在相应位上的数都是1时,该位取1,否则为0.
例、5&-5
5:0000 0000 0101
-5:1111 1111 1011 一个负数的二进制形式是用补码来表示的
结果:0000 0000 0001

|:只要在相应位上存在1,那么该位就取1,如果都不为1,就为0。
例、5|-5
5:0000 0000 0101
-5:1111 1111 1011
结果:1111 1111 1111

^:如果在相应的位置上的数相同,该位取0,如果不同,取1。
例、5^-5
5:0000 0000 0101
-5:1111 1111 1011
结果:1111 1111 1110

任何数异或0都是其本身,一个数异或自己就等于0。
例、交换x,y值

x^=y; 
y^=x;
x^=y;

1.题目:编写程序,打印出9×9乘法表

#include <stdio.h>

int main()
{
    int i,j;
    for(i=1;i<=9;i++)
    {
        for(j=1;j<=i;j++)
        {
            printf("%d*%d=%d\t",i,j,i*j);
        }
        printf("\n");
    }
    return 0;
}

2.题目:编写程序,实现strcmp()相同功能myStrcmp()函数

#include <stdio.h>
int myStrcmp(char a[],char b[])
{
    int i=0,t;
    while(a[i]!='\0'||b[i]!='\0')
    {
        if(a[i]==b[i])
        {
            t=0;
        }
        else if(a[i]>b[i])
        {
            t=1;
        }
        else
        {
            t=-1;
        }
        if(t!=0)
        {
            break;
        }
        i++;
    }
    return t;
}
int main()
{
    int q=0;
    char a[100],b[100];
    fgets(a,100,stdin);
    fgets(b,100,stdin);
    q=myStrcmp(a,b);
    printf("若输出0为相等,1为第一个大,2为第二大   %d\n",q);
    return 0;
}

3.题目:编写程序,将十进制转换为8进制并输出(不允许使用printf("%o"))

#include <stdio.h>

int main()
{
    int num;//定义十进制数
    int i,a[100];
    int m,j;
    printf("输入十进制数:\n");
    scanf("%d",&num);
    for(i=0;i<100;i++)
    {
        if(num!=0)
        {
            m=num%8;
            a[i]=m;
            num=num/8;
        }
        else
        {
            break;
        }
    }
    printf("输出八进制数:\n");
    for(j=i;j>=0;j--)
    {
        printf("%d",a[j]);
    }
    return 0;
}

4.题目:编写程序,打印菱形星号组合

#include <stdio.h>

int main()
{
    int i,j;
    char a[][7]={{' ',' ',' ','*'},{' ',' ','*',' ','*'},{' ','*',' ',' ',' ','*'},{'*',' ',' ',' ',' ',' ','*'},{' ','*',' ',' ',' ','*'},{' ',' ','*',' ','*'},{' ',' ',' ','*'}};
    for(i=0;i<7;i++)
    {
        for(j=0;j<7;j++)
        {
            printf("%c",a[i][j]);
        }
        printf("\n");
    }
    return 0;
}

5.题目:输入一个整数n,求从1到n这n个整数的十进制表示中1出现的次数。(google面试题)

例如  输入12,从1到12这些整数中包含1 的数字有1,10,11和12,1一共出现了5次。
分析:这是一道广为流传的google面试题
#include <stdio.h>

int main()
{
    int n,i=1;
    printf("输入一个整数:\n");
    scanf("%d",&n);
    int c=0;
    int t;
    while(i<=n)
    {
        t=i;
        while(t!=0)
        {
            if(t%10==1)
            {
                c++;
            }
            t=t/10;
        }
        i++;
    }
    printf("一共出现了 %d 次",c);
    return 0;
}

7.题目:输入一个整数a,再输入两个整数p1,p2(p1,p2<32),输出该整数的二进制表示方法中从右端开始的p1到p2位.

#include <stdio.h>
void run(long n,int p1,int p2)
{
    int t;
    int i;
    long w;
    if(p1>p2)
    {
        t=p1;
        p1=p2;
        p2=t;
    }
    for(i=p1;i<=p2;i++)
    {
        w=n&(1<<i-1);
        if(w)
        {
            printf("1");
        }
        else
        {
            printf("0");
        }
    }
}
int main()
{
    long a;
    printf("输入整数:\n");
    scanf("%ld",&a);
    int p1,p2;
    printf("输入p1,p2:\n");
    scanf("%d%d",&p1,&p2);
    run(a,p1,p2);
    return 0;
}

8.题目:输入一个整数a,再输入两个整数p1,p2(p1,p2<32),将该整数的二进制表示方法中从右端开始的p1到p2位取反后输出

#include <stdio.h>
void trun(long n,int p1,int p2)
{
    int t;
    int i;
    long w;
    if(p1>p2)
    {
        t=p1;
        p1=p2;
        p2=t;
    }
    for(i=p1;i<=p2;i++)
    {
        w=n&(1<<i-1);
        if(w)
        {
            printf("0");
        }
        else
        {
            printf("1");
        }
    }
}
int main()
{
    long a;
    printf("输入一个整数:\n");
    scanf("%ld",&a);
    int p1,p2;
    printf("输入p1,p2:\n");
    scanf("%d%d",&p1,&p2);
    trun(a,p1,p2);
    return 0;
}

若在编译过程中,出现“错误:程序中有有游离的’\……’”,可能就是输入法的半角全角问题,也就是中英文的标点符号的问题。
以上就是我今天所了解掌握的内容。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值