这是我的第一个问题,所以我要求了解。下面是将十进制数转换为二进制的函数。我不明白这里发生了什么int bit = (weight[i] & s)
:
void showbits(unsigned char s)
{
unsigned char weight[8] = { 1,2,4,8,16,32,64,128 };
for (int = 7; i >= 0; i--)
{
int bit = (weight[i] & s);
if (bit != 0)
cout << '1';
else cout << '0';
}
}
答案 0 :(得分:1)
int位=(weight [i]&s)是什么意思
T name = expression;
是变量声明的语法。该变量是从表达式初始化的副本。
int bit = expression;
这将声明类型为bit
的变量int
。
array[index]
这是数组下标运算符。结果将是给定索引处数组元素的值。
left & right
这是按位与运算。当且仅当两个操作数中相同位置的位均为1时,结果的每一位才为1。
int bit = (weight[i] & s)
这结合了以上所有内容。括号可用于更改操作顺序,但是在这种情况下,它们是多余的。
答案 1 :(得分:0)
此声明
unsigned char weight[8] = { 1,2,4,8,16,32,64,128 };
设置用于按位与运算的掩码。您可以像这样重写它
unsigned char weight[8] = { 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80 };
这个按位AND表达式
weight[i] & s;
检查对象s
中的对应位是否设置为1。
例如,如果s的值为'\x65' then these operations with the masks
'\x65' & 0x01
'\x65' & 0x04
'\x65' & 0x20
'\x65' & 0x40
将产生不等于0的结果。
请注意,您的代码中有错字
for (int = 7; i >= 0; i--)
应该在
for (int i = 7; i >= 0; i--)
这是一个演示程序
#include <iostream>
#include <iomanip>
void showbits( unsigned char c )
{
unsigned char weight[8] = { 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80 };
for ( int i = 7; i >= 0; i-- )
{
std::cout << ( ( weight[i] & c ) ? '1' : '0' );
}
std::cout << '\n';
}
int main()
{
char c = 'e';
std::cout << "\'" << c << "\' - " << std::hex << static_cast<int>( c ) << '\n';
showbits( c );
return 0;
}
如果系统支持ASCII编码,则输出为
'e' - 65
01100101
答案 2 :(得分:0)
在C语言中,&
运算符可以具有两种含义:
另外,在C ++中(但在C语言中不是),在声明变量时使用它可能意味着声明的变量是引用。
在您描述问题的情况下,&
运算符是按位AND运算符。
为了了解发生了什么,我将用二进制表示形式写weight
数组的所有值:
00000001 (1)
00000010 (2)
00000100 (4)
00001000 (8)
00010000 (16)
00100000 (32)
01000000 (64)
10000000 (128)
通过对功能参数s
与上面列出的值一起执行按位AND运算,将在每次循环迭代中从变量s
中提取某个位。在循环的第一次迭代中,将提取并打印最低有效(即最低)位,在循环的第二次迭代中,将提取下一个比特,依此类推。