Задачка на С
От: Wermut  
Дата: 21.05.04 09:55
Оценка: 4 (1)
Как за 2 операции сбросить младший значащий бит в байте?
Re: Задачка на С
От: Demon Россия  
Дата: 21.05.04 10:01
Оценка: 4 (1)
Здравствуйте, Wermut, Вы писали:

W>Как за 2 операции сбросить младший значащий бит в байте?


   BYTE b;
   b = (b-1) & b;
Re[2]: Задачка на С
От: Wermut  
Дата: 21.05.04 10:06
Оценка:
Здравствуйте, Demon, Вы писали:

D>Здравствуйте, Wermut, Вы писали:


W>>Как за 2 операции сбросить младший значащий бит в байте?


D>
D>   BYTE b;
D>   b = (b-1) & b;
D>



Младший значащий бит — это самый младший бит из всех не равных нулю, так что ваш пример не подходит для b == 2;
Re[3]: Задачка на С
От: Demon Россия  
Дата: 21.05.04 10:11
Оценка:
Здравствуйте, Wermut, Вы писали:

W>Здравствуйте, Demon, Вы писали:


D>>Здравствуйте, Wermut, Вы писали:


W>>>Как за 2 операции сбросить младший значащий бит в байте?


D>>
D>>   BYTE b;
D>>   b = (b-1) & b;
D>>



W>Младший значащий бит — это самый младший бит из всех не равных нулю, так что ваш пример не подходит для b == 2;


Из 2 (00000010) должно получиться 0 (00000000). Так?

    b  = 2;      // b  == 2 (00000010)
    b1 = b - 1;  // b1 == 1 (00000001)
    b  = b1 & b; // b  == 0 (00000010 & 00000001 == 00000000)
Re[3]: Задачка на С
От: komaz Россия  
Дата: 21.05.04 10:13
Оценка:
Здравствуйте, Wermut, Вы писали:

W>Младший значащий бит — это самый младший бит из всех не равных нулю, так что ваш пример не подходит для b == 2;

Почему не подходит: (2-1)&1 = 0, все верно
Это решение верно всегда
Пусть двоичная форма числа имеет вид
a = xx...xx100...0
после отнимания единички:
a — 1 = xx...xx011...1
Это следует из элементарного отнимания столбиком
соответственно a&(a — 1) даст только xx...xx000...0
Re[4]: Задачка на С
От: Wermut  
Дата: 21.05.04 10:15
Оценка:
Здравствуйте, Demon, Вы писали:

D>Здравствуйте, Wermut, Вы писали:


W>>Здравствуйте, Demon, Вы писали:


D>>>Здравствуйте, Wermut, Вы писали:


W>>>>Как за 2 операции сбросить младший значащий бит в байте?


D>>>
D>>>   BYTE b;
D>>>   b = (b-1) & b;
D>>>



W>>Младший значащий бит — это самый младший бит из всех не равных нулю, так что ваш пример не подходит для b == 2;


D>Из 2 (00000010) должно получиться 0 (00000000). Так?


D>
D>    b  = 2;      // b  == 2 (00000010)
D>    b1 = b - 1;  // b1 == 1 (00000001)
D>    b  = b1 & b; // b  == 0 (00000010 & 00000001 == 00000000)
D>


да , дейставительно.

Прошу меня извинить за поспешный ответ.
Re: Задачка на С
От: ilnar Россия  
Дата: 21.05.04 10:28
Оценка: 4 (1) -1
Здравствуйте, Wermut, Вы писали:

W>Как за 2 операции сбросить младший значащий бит в байте?



x & ~1
Re[4]: Задачка на С
От: Socrat Россия  
Дата: 24.05.04 08:40
Оценка:
Здравствуйте, komaz, Вы писали:

K>Здравствуйте, Wermut, Вы писали:


W>>Младший значащий бит — это самый младший бит из всех не равных нулю, так что ваш пример не подходит для b == 2;

K>Почему не подходит: (2-1)&1 = 0, все верно

2 = 10
2-1 = 01
(2-1)&1 = 01

Re[2]: Задачка на С
От: maq Россия http://www.maqdev.com
Дата: 24.05.04 09:18
Оценка:
I>
I>x & ~1
I>



Неверно — этот код сбросит не младщий значащий бит, а просто младший.
Re[3]: Задачка на С
От: ilnar Россия  
Дата: 24.05.04 09:59
Оценка:
Здравствуйте, maq, Вы писали:

I>>
I>>x & ~1
I>>



maq>Неверно — этот код сбросит не младщий значащий бит, а просто младший.

тогда не знай товарищь, на асме можно так:
правда в три операции

  bsf eax, value
  jz null
  btr value, eax
null:
Re: Задачка на С
От: Plague Россия  
Дата: 25.05.04 07:28
Оценка:
Здравствуйте, Wermut, Вы писали:

W>Как за 2 операции сбросить младший значащий бит в байте?


x = (~x+1) & x;
... << RSDN@Home 1.1.3 stable >>
Re[2]: Задачка на С
От: ilnar Россия  
Дата: 25.05.04 07:43
Оценка:
Здравствуйте, Plague, Вы писали:

P>Здравствуйте, Wermut, Вы писали:


W>>Как за 2 операции сбросить младший значащий бит в байте?


P>
P>x = (~x+1) & x;
P>


похоже надо так:
x ^= (~x+1) & x;
Re[3]: Задачка на С
От: Plague Россия  
Дата: 25.05.04 07:55
Оценка:
Здравствуйте, ilnar, Вы писали:

I>Здравствуйте, Plague, Вы писали:


P>>Здравствуйте, Wermut, Вы писали:


W>>>Как за 2 операции сбросить младший значащий бит в байте?


P>>
P>>x = (~x+1) & x;
P>>


I>похоже надо так:

I>
I>x ^= (~x+1) & x;
I>


вот так:

x = ~(~x+1) & x;
... << RSDN@Home 1.1.3 stable >>
Re: Задачка на С
От: Аноним  
Дата: 25.05.04 09:00
Оценка: -2
Здравствуйте, Wermut, Вы писали:

W>Как за 2 операции сбросить младший значащий бит в байте?



byte b = <число>;

b = ((b>>1)<<1);
Re[5]: Задачка на С
От: komaz Россия  
Дата: 25.05.04 11:27
Оценка:
Здравствуйте, Socrat, Вы писали:

S>Здравствуйте, komaz, Вы писали:


K>>Здравствуйте, Wermut, Вы писали:


W>>>Младший значащий бит — это самый младший бит из всех не равных нулю, так что ваш пример не подходит для b == 2;

K>>Почему не подходит: (2-1)&1 = 0, все верно

S>2 = 10

S>2-1 = 01
S>(2-1)&1 = 01

S>

Очевидно же что описка
Re[3]: Задачка на С
От: Андрей Тарасевич Беларусь  
Дата: 25.05.04 21:23
Оценка:
Здравствуйте, maq, Вы писали:

I>>
I>>x & ~1
I>>


maq>Неверно — этот код сбросит не младщий значащий бит, а просто младший.


Бред. Откуда это вы выкопали такое значение слова "значащий"?

Ответ ilnar-а соврешенно верен — такой код действительно сбрасывает младший значащий бит байта. Который в традиционных целочисленных представлениях всегда является просто сладшим битом байта.

Автора задачи по видимому хотел сбросить младший ненулевой бит. Тогда так и надо было говрить.
Best regards,
Андрей Тарасевич
Re[3]: Задачка на С
От: Андрей Тарасевич Беларусь  
Дата: 25.05.04 21:25
Оценка:
Здравствуйте, Wermut, Вы писали:

W>>>Как за 2 операции сбросить младший значащий бит в байте?


D>>
D>>   BYTE b;
D>>   b = (b-1) & b;
D>>



W>Младший значащий бит — это самый младший бит из всех не равных нулю, так что ваш пример не подходит для b == 2;


Нет. Младший значащий бит в традиционных целочисленных представлениях — это просто младший бит. А равен он нулю или не равен никакой роли не играет.

Внимательнее надо формулировать условия задач.
Best regards,
Андрей Тарасевич
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.