`
talin2010
  • 浏览: 512994 次
  • 性别: Icon_minigender_1
  • 来自: 河北
社区版块
存档分类
最新评论

位运算试题

 
阅读更多

---------------------------------------------------------------------------

1. 计算一个整数中比特位值为 1 的位数。

直观解法:
int countOnes(int x)
{
int count = 0;
for(; x; x >>= 1)
{
if (x & 1)
{
++count;
}
}
return count;
}

改进:
/* 说明:每次 x &= x - 1 操作都将 x 最右一位 1 置为 0。 */
int countOnes(int x)
{
int count = 0;
for(; x; x &= x - 1)
{
++count;
}
return count;
}

进一步改进:
/* 分治策略 (参考《Hacker's Delight》) */
int countOnes(int x)
{
x = (x & 0x55555555) + ((x >> 1) & 0x55555555); /* 计算相邻 2 位中 1 的个数。 */
x = (x & 0x33333333) + ((x >> 2) & 0x33333333); /* 计算相邻 4 位中 1 的个数。 */
x = (x & 0x0F0F0F0F) + ((x >> 4) & 0x0F0F0F0F); /* 计算相邻 8 位中 1 的个数。 */
x = (x & 0x00FF00FF) + ((x >> 8) & 0x00FF00FF); /* 计算相邻 16 位中 1 的个数。 */
x = (x & 0x0000FFFF) + ((x >>16) & 0x0000FFFF); /* 计算相邻 32 位中 1 的个数。 */

return x;
}

---------------------------------------------------------------------------

2. 逆转一个整数的二进制位。(比如,01011011 逆转后的结果为 11011010。)

/* 分治策略 (参考《Hacker's Delight》) */
int reverse(int x)
{
x = (x & 0x55555555) << 1 | (x & 0xAAAAAAAA) >> 1; /* 交换相邻的 1 位。 */
x = (x & 0x33333333) << 2 | (x & 0xCCCCCCCC) >> 2; /* 交换相邻的 2 位。 */
x = (x & 0x0F0F0F0F) << 4 | (x & 0xF0F0F0F0) >> 4; /* 交换相邻的 4 位。 */
x = (x & 0x00FF00FF) << 8 | (x & 0xFF00FF00) >> 8; /* 交换相邻的 8 位。 */
x = (x & 0x0000FFFF) << 16 | (x & 0xFFFF0000) >> 16; /* 交换相邻的 16 位。 */

return x;
}

对上述解法略做改进:
/* 分治策略 (参考《Hacker's Delight》) */
int reverse(int x)
{
x = (x & 0x55555555) << 1 | (x & 0xAAAAAAAA) >> 1; /* 交换相邻的 1 位。 */
x = (x & 0x33333333) << 2 | (x & 0xCCCCCCCC) >> 2; /* 交换相邻的 2 位。 */
x = (x & 0x0F0F0F0F) << 4 | (x & 0xF0F0F0F0) >> 4; /* 交换相邻的 4 位。 */
x = (x << 24) | ((x & 0xFF00) << 8) | ((x >> 8) & 0xFF00) | (x >> 24);

return x;
}

---------------------------------------------------------------------------

3. 计算一个整数开头的比特位为 0 的位数。(比如,对于 00010101,得到的位数为 3。)

/* 参考《Hacker's Delight》 */
int countLeadingZeros(int x)
{
int count = 0;

if (x == 0) {return 32;}
if ((x & 0x0000FFFF) == 0) {count = count +16; x = x <<16;}
if ((x & 0x00FFFFFF) == 0) {count = count + 8; x = x << 8;}
if ((x & 0x0FFFFFFF) == 0) {count = count + 4; x = x << 4;}
if ((x & 0x3FFFFFFF) == 0) {count = count + 2; x = x << 2;}
if ((x & 0x7FFFFFFF) == 0) {count = count + 1;}

return count;
}

---------------------------------------------------------------------------

4. 计算一个整数结尾的比特位为 0 的位数。(比如,对于 10101000,得到的位数为 3。)

/* 参考《Hacker's Delight》 */
int countTrailingZeros(int x)
{
int count = 0;

if (x == 0) {return 32;}
if ((x & 0x0000FFFF) == 0) {count = count +16; x = x >>16;}
if ((x & 0x000000FF) == 0) {count = count + 8; x = x >> 8;}
if ((x & 0x0000000F) == 0) {count = count + 4; x = x >> 4;}
if ((x & 0x00000003) == 0) {count = count + 2; x = x >> 2;}
if ((x & 0x00000001) == 0) {count = count + 1;}

return count;
}

对上述解法略做改进:
/* 参考《Hacker's Delight》 */
int countTrailingZeros(int x)
{
int count = 0;

if (x == 0) {return 32;}
if ((x & 0x0000FFFF) == 0) {count = count +16; x = x >>16;}
if ((x & 0x000000FF) == 0) {count = count + 8; x = x >> 8;}
if ((x & 0x0000000F) == 0) {count = count + 4; x = x >> 4;}
if ((x & 0x00000003) == 0) {count = count + 2; x = x >> 2;}

return count + 1 - (x & 1);
}

---------------------------------------------------------------------------

分享到:
评论

相关推荐

    位运算练习题_参考答案.pdf

    位运算练习题参考答案 本文档提供了一系列位运算练习题的参考答案,涵盖了位运算的基本概念、运算符优先级、位运算符的使用、掩码的应用、移位运算等知识点。 1. 位运算符优先级 在 C 语言中,位运算符的优先级从...

    C语言位运算练习题1[文].pdf

    "C语言位运算练习题1" 本资源提供了15道C语言位运算练习题,涵盖了位运算、逻辑运算和移位运算等知识点。这些题目可以帮助程序员和开发者熟悉C语言的基本运算符和操作符,提高编程能力和解决问题的能力。 在第一个...

    二年级100以内加减混合运算练习1000题.pdf

    标题和描述中提到的“二年级100以内加减混合运算练习1000题.pdf”指的是一份面向二年级学生的数学练习册,涵盖了100以内的加法和减法混合运算。尽管描述中提到的“技术”标签可能暗示这份文件是通过某种技术手段生成...

    四则运算练习器

    在教育领域,四则运算练习器被广泛用于家庭作业的辅助工具,教师也可以利用其来设计个性化的练习题,针对性地提高学生的计算能力。对于家长来说,这是一个便捷的方式,可以在家中监督孩子的学习进度,同时提供互动式...

    四年级数学混合运算计算练习题.pdf

    这份文件为四年级数学混合运算计算练习题,虽然仅提供了标题、描述和部分内容,但是我们可以从这些信息中提炼出关于四年级数学混合运算的关键知识点。 首先,混合运算属于基础数学运算的一部分,主要涉及加减乘除四...

    (完整版)小学一年级20以内加减混合运算练习题(2).pdf

    练习题的编排遵循了循序渐进的原则,难度逐渐增加,有些题目可能包含多位数的加法和减法,甚至在某些题目中引入了进位和退位的概念,如“13+5-6”。这类问题考察了学生对数字的敏感度以及计算过程中对进位或借位的...

    小学五年级小数加减乘除混合运算练习题.pdf

    这些练习题旨在提升学生的计算能力和对运算顺序的理解。以下是对这些知识点的详细解析: 1. **解方程**:在解方程时,孩子们需要运用等式的性质,如加减平衡和乘除平衡,来求解未知数。例如,第一题5x=450,解得x=...

    三年级数学加减乘除混合运算练习试题(卷).doc

    这些练习题覆盖了小学三年级数学的核心知识点,对于培养学生的数学思维能力和运算技巧至关重要。通过反复练习,学生可以逐步提高他们的计算速度和准确性,为后续更复杂的数学学习打下坚实的基础。同时,家长和教师...

    四则混合运算练习题三.doc

    文档"四则混合运算练习题三.doc"是一个包含一系列四则运算练习题的资料,主要目的是帮助学习者巩固加法、减法、乘法和除法的混合运用能力。四则运算在数学基础中占据重要地位,是解决复杂数学问题的基础。下面是针对...

    三年级混合运算练习题.pdf

    根据提供的文件信息,可以了解到《三年级混合运算练习题.pdf》是一份针对三年级学生的数学练习题。这份练习题的主要目的是帮助学生熟悉和掌握混合运算,即包括加法、减法、乘法和除法等在内的各种运算的混合使用。...

    二年级加减混合运算练习题.pdf

    2. 数学练习题的构成:由简单的数字加减逐步过渡到复杂的多位数运算。 3. 运算顺序:理解加减法的基本规则,以及在有括号时优先计算括号内的内容。 4. 教育技术应用:OCR扫描文档的识别准确性及对识别错误的处理。 5...

    三年级数学加减乘除混合运算练习试题.doc

    这份文档是针对三年级学生的数学加减乘除混合运算练习试题,旨在帮助他们巩固基础数学技能。练习涵盖了多种类型的算术问题,包括简单的乘法、除法、加法、减法,以及涉及括号的复合运算。以下是根据文档内容提炼出的...

    有理数的运算练习题.doc

    【有理数的运算练习题】是一份针对初高中学生的数学习题,旨在复习和巩固有理数的五种基本运算:加法、减法、乘法、除法和乘方。以下是根据题目内容解析的一些知识点: 1. **有理数的概念**:有理数是可以表示为两...

    课题:第一章有理数混合运算练习题借鉴.pdf

    从给定的文件信息中,我们可以看出这是关于数学领域中“有理数混合运算练习题”的一个文件。有理数混合运算是一种基础的数学运算形式,涉及到正数和负数的加减乘除,以及它们在复杂算式中的综合运用。该文件标题和...

    二年级上册数学两位数加减混合运算练习题及答案.doc

    二年级上册数学两位数加减混合运算练习题及答案.doc

    五年级小数混合运算练习题.doc

    这些题目是针对五年级学生设计的小数混合运算练习题,旨在帮助他们巩固和提升对小数加减乘除的理解和运算能力。小数混合运算是基础数学中的一个重要部分,它涉及到小数的加法、减法、乘法以及在同一个算式中不同运算...

    (完整版)分数四则混合运算易错题练习.pdf

    不过,从标题“分数四则混合运算易错题练习.pdf”中可以推断,该文件可能是用于教育或练习目的,包含了一系列涉及分数的四则混合运算练习题。四则混合运算包括加、减、乘、除四种运算,而且可能会在同一个问题中出现...

    (完整版)小学三年级下册三位数除以一位数口算题练习题.pdf

    "小学三年级下册三位数除以一位数口算题练习题.pdf" 资源标题分析:这份资源的标题是“(完整版)小学三年级下册三位数除以一位数口算题练习题.pdf”,从标题中可以看出,这是一个小学三年级的数学练习题,专门针对三...

Global site tag (gtag.js) - Google Analytics