在哪里学习“位”?

时间:2011-05-23 02:04:52

标签: c++ c architecture bit-manipulation bit

我试图找到一些书籍或资源详细讨论比特,以便例如我能够将数字(如16)翻译成比特。我目前是一名高中生,每当阅读编程书籍时,我几乎可以理解除了位/位运算符部分之外的所有内容。我只是不知道它是如何工作的,为什么人们甚至发明了bit& byte :(。因此,我希望你们能给我一些资源建议,讨论如何将数字/字符翻译成位。

感谢您回答我的问题并度过了美好的一天!

9 个答案:

答案 0 :(得分:8)

尝试谷歌搜索'二进制算术'。这是一个 pretty good article,可以帮助您入门。

答案 1 :(得分:5)

您的问题与编码或任何特定的编程语言无关,但更多的是数学,特别是代数和数字系统。然后下一阶段将是处理器x86架构的基础知识,而不是你可以去编程语言。

BTW:通常关于x86病毒的书籍是了解CPU工作方式的良好开端,但如果没有理解base-2和base-16系统,你就不会从中得到很多。

答案 2 :(得分:5)

http://en.wikiversity.org/wiki/Bitwise_operators

http://en.wikipedia.org/wiki/Binary_numbers

一旦你学会了如何用基数2(二进制或“位”)表示数字,按位运算符很容易理解。

我只想举一些简单的例子:

设m = 31532 = 111101100101100,n = 12325 = 11000000100101。

然后n&的结果m(按位AND - 二元运算符)是:

(如果n(i)和m(i)都是1,那么结果是1,0否则)

111101100101100
011000000100101
===============
011000000100100

n |的结果m(按位OR - 二元运算符)是:

(如果n(i)和m(i)为0,则结果为0,否则为1)

111101100101100
011000000100101
===============
111101100101101

n ^ m(按位eXclusive OR - 二元运算符)的结果是:

(如果n(i)和m(i)是1,但不是两个,那么结果是1,0否则)

111101100101100
011000000100101
===============
100101100001001

~n(按位非一元运算符)的结果是:

(如果n(i)= 1则结果为0,否则为1)

111101100101100
===============
000010011010011

令k = 3,n>>的结果k(按位右移)是:

111101100101100
===============
000111101100101

他们只是向右移动k = 3次。这有效地将数字除以2 ^ k = 8。它通常被编译器用作优化。

相反,令k = 3,n<<< k(按位左移)是

111101100101100
===============
101100101100000

他们只是向左转k = 3次。这有效地将数字乘以2 ^ k = 8。这里要注意的一件事是因为32位整数只能容纳2 ^ 32-1,所以有一个算术溢出,即已经切断了较高的k位。

你必须仔细看看这些并找出这些模式。

它们在编程中很重要,因为它们通常用于设置/清除标志值。

因为int32有32个二进制数字,所以它最多可以包含32种不同的布尔标志(0表示false,1表示true)

我认为这是关于它的。它们非常直观。

答案 3 :(得分:3)

它们之间没有区别,因为我觉得它们无法比较。有点被“发明”,因为计算机只知道两种状态,在(1)或关闭(0)。一个字节只是8位。我不知道任何完全专注于讨论某个字节或字节的书籍,但如果你看一下有关逻辑设计,数字基础知识或任何有关硬件架构的书籍的书籍,你会发现有关比特及其使用方法的更多信息。 。汇编语言也比高级语言更多地处理比特,所以你也可能想要研究它。

答案 4 :(得分:2)

不是一本书,但Wikipedia article on Binary representations of numbers过于详细。 <{3}}上有一个很好的部分,你可能觉得它很有用。

converting between bases;来自There are some scary clever tricks to working with bitfields and binary representations of numbers

int stb_bitcount(unsigned int a)
{
   a = (a & 0x55555555) + ((a >>  1) & 0x55555555); // max 2
   a = (a & 0x33333333) + ((a >>  2) & 0x33333333); // max 4
   a = (a + (a >> 4)) & 0x0f0f0f0f; // max 8 per 4, now 8 bits
   a = (a + (a >> 8)); // max 16 per 8 bits
   a = (a + (a >> 16)); // max 32 per 8 bits
   return a & 0xff;
}

unsigned int stb_bitreverse8(unsigned char n)
{
   n = ((n & 0xAA) >> 1) + ((n & 0x55) << 1);
   n = ((n & 0xCC) >> 2) + ((n & 0x33) << 2);
   return (unsigned char) ((n >> 4) + (n << 4));
}

unsigned int stb_bitreverse(unsigned int n)
{
  n = ((n & 0xAAAAAAAA) >>  1) | ((n & 0x55555555) << 1);
  n = ((n & 0xCCCCCCCC) >>  2) | ((n & 0x33333333) << 2);
  n = ((n & 0xF0F0F0F0) >>  4) | ((n & 0x0F0F0F0F) << 4);
  n = ((n & 0xFF00FF00) >>  8) | ((n & 0x00FF00FF) << 8);
  return (n >> 16) | (n << 16);
}

简直太神奇了。 :)

答案 5 :(得分:2)

我读过的关于二进制数学和位移的最好的书之一是Hacker's Delight.这本书实际上与超优化有关。我强烈建议阅读它,如果材料太复杂,那么通过它会很慢。我之前必须为业余爱好操作系统重写标准库函数,如strlen(),这本书挽救了我的生命。

答案 6 :(得分:1)

回答部分问题......

只需在Google搜索框中输入16 to binary即可。如果你真的很勇敢,可以输入16 to hex来获得十六进制答案。 :)

答案 7 :(得分:1)

计算机世界中的所有东西都只能用'0'表示。 '1'字符串。例如,int类型通用具有32位,long long类型具有64位,n位类型可以表示从0到2 ^ n-1的数字。

此外,位操作如'&lt;&lt;&lt;','&gt;&gt;','&amp;'或'|'比计算机中的算术运算更快,因为它使用硬件来执行此操作。并且可以根据此优化许多代码。

将int转换为二进制,首先你要知道的是任何数字都可以用2 ^ 0,2 ^ 1,2 ^ 2的组合来表示.... 2 ^ k:喜欢6 = 2 ^ 2 + 2 ^ 1,13 = 2 ^ 3 + 2 ^ 2 + 2 ^ 0等等,那么6和13可以写成0110和1101.实际上,这是一个数学问题。

如果您想了解有关位操作的更多信息,我认为您可以在谷歌或维基上搜索,而不是在这里搜索。

答案 8 :(得分:0)

我建议学习编程z80,PIC或其他微处理器。然后你就会明白比特和字节的来源。在你这样做之前,你可能想要弄脏数字电子产品。比特存在的原因是因为数字电子设备只有2个值的信号,即开和关,因此1和0,或者一点。