Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Побитовые операции


Автор: inside_pointer 11.3.2008, 04:15
Описание темы не пишу, потому что оно сканирует форум и выключает все окна файрфокса.

Цитата из К&R

Цитата

Например, следующий оператор обнуляет все биты переменной n, кроме младших семи:
n = n & 0177


Вопросы:
что за младшие биты, а что есть старшие ещё, а бит знака как работает, он где слева или справа, при каких значениях бита знак будет минус при каких плюс?

Ещё:
Это что двоичное число или восьмеричное, если это восьмеричное, то оно переводится в двоичную а потом происходит операция сравнения битов?

Бывает ещё константы задаются в виде a = 01, b = 04 это какие числа, восьмеричные или какие-то другие?

Автор: korian 11.3.2008, 04:50
0123 - восмеричное
123 - десятичное
0x123 - шестнадцатиричное


Цитата(inside_pointer @  11.3.2008,  03:15 Найти цитируемый пост)
что за младшие биты, а что есть старшие ещё, а бит знака как работает, он где слева или справа, при каких значениях бита знак будет минус при каких плюс?

если брать 8-и битовое число
00000001 - младший бит (во всех системах измерения равно еденице)
10000000 - старший бит (128, 0200, 0x80)
если тип знаковый (signed), то старший бит является знаковым (установлен, если число отрицательное)

Цитата(inside_pointer @  11.3.2008,  03:15 Найти цитируемый пост)
Это что двоичное число или восьмеричное, если это восьмеричное, то оно переводится в двоичную а потом происходит операция сравнения битов?

в компах все представилено в двоичном виде. (все данные "переводятся" в двоичную форму, если можна так выразиться)

битовые операция производяться вне зависимости от того, имеет ли число знак или что либо еще.
каждый бит сравнивается со своим битом.

long a = -10; // 0xFFFFFFF6
a = a & 0x80000000; //a будет равно -2147483648 (0x80000000);
unsigned long b = 10; // 0x0000000A
b = b | 0x80000000; //b будет равно 2147483658 (0x8000000A);

для битовых операций есть смысл использовать 8-и или 16-иричные числа,
т.к. в 8-ричной системе 1 цифра отвечает за 3 бита (07 = 111)
а в 16-ричной 1 цифра отвечает за 4 бита (0xF = 1111)
в десятичной системе, таких зависимостей нету.

Автор: inside_pointer 11.3.2008, 05:29
спасибо, korian, исчерпывающе

0177

0 - признак восьмеричности, отбрасываем

177

раскладываем по тройкам

001 111 111

тут получилось 9 цифр, а в байте 8 бит, отбрасываем первый ноль

01 111 111

дальше n = n & 0177 превратилось в

n = n & 01 111 111

Цитата
 оператор обнуляет все биты переменной n, кроме младших семи 


значит младшие биты это те, которые справа, а старшие те, которые слева
левые - старшие
правые - младшие

правые семь бит не обнуляются, это в каком случае, когда n = 11 111 111 чтоли ?

там в книжке просто n и всё, не сказано чему равно

Автор: korian 11.3.2008, 05:46
Цитата(inside_pointer @  11.3.2008,  04:29 Найти цитируемый пост)
там в книжке просто n и всё, не сказано чему равно

в зависимости от n получаем результат
n = 012 //00001010
n = n & 0177 // 00001010 & 01111111 = 00001010
n = 0377 //11111111
n = n & 0177 // 11111111 & 01111111 = 01111111

т.е. при данной операции 7 младших битов будут такими же, как и у числа n
остальные биты будут нулями.

Автор: inside_pointer 11.3.2008, 07:43
Всё терь понял до конца, спасибо.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)