2015-1-3 题目点小结

本文探讨了C语言中变量名重复导致的问题,并介绍了按位运算符的使用方法及技巧,特别是巧妙利用按位与实现二进制1计数的方法,同时提供了一种更高效的计数算法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.变量名重复,运行结果会如何?

int i=1;
int main()
{
    int i=i;
}

结果是i没有初始化!


因为重名,函数外的i根本就无法传入main函数!

2.& |运算符的概念,按位与、按位或。

以上两个运算符针对二进制。对于十进制,会先转换为二进制再进行运算。


3.x&(x-1)实现统计二进制1的个数

这条语句很巧妙。减一运算,每次都会让按位与的结果从尾部减少一个1,即使有一堆0,也会因为借位而实现功能,其时间复杂度是O(n)

而还有一种更加效率的办法,时间复杂度为O(lgN),代码如下。核心思想是按照两位两位的组合来统计1的个数

#include <stdio.h>

int main()
{
        unsigned int x = 0xffffffff;

        x = (x&0x55555555) + ((x>>1)&0x55555555); //01010101
        x = (x&0x33333333) + ((x>>2)&0x33333333); //00110011
        x = (x&0x0f0f0f0f) + ((x>>4)&0x0f0f0f0f); //00001111
        x = (x&0x00ff00ff) + ((x>>8)&0x00ff00ff); //0000000011111111
        x = x + (x>>16);

        printf("%d\n", x & 0x0000003f);

        return 0;
}

4.代码风格一小点

if(A=='a') {……}
if('a'==A) {……}//哪种更好呢?
按照书上说的,第二条可以避免错写==为=……我觉得这个没那么重要吧,现在常常写的是变量名放前面

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值